---
# System prepended metadata

title: 新的虛擬機Defects4j設定。

---

# 新的虛擬機Defects4j設定。

## 前置設定
```
sudo apt update
sudo apt upgrade -y
```
 
安裝OpenJDK8
```
sudo apt install openjdk-8-jdk -y
```
確認java 8版本，確認有成功安裝。
```
java -version
javac -version
```
 
因為新版ubuntu可能已經不再適用Java 7，透過這樣的步驟實現。
:::info
這個java 1.7.10是從Oracle上抓的，存放在我的google雲端，如果要其他已經無法下載的java版本，一樣從Oracle自己找。
[Java 1.7.10.tar.gz](<https://drive.google.com/file/d/18hfujRsl0yO7DYTcl87-32CVzA1P6bJX/view?usp=sharing>)
:::

:::    success
補充1.8的檔案
[Java 1.8.tar.gz](<https://drive.google.com/file/d/1q90flX7bUSYJZdHsR589ric4lgRv_nRU/view?usp=sharing>)
我就是在opt裡面創一個JDK8放在裡面
sudo tar -zxvf jdk-8u401-linux-x64.tar.gz -C /opt/JDK8
:::


下載java 7的tar.gz檔案。
建立一個存放Java 7的資料夾，開一個新的Terminal，輸入下列指令。
```
cd ../..
cd opt
sudo mkdir JDK
```
回到Downloads資料夾，並將剛剛下載的tar.gz檔案解壓縮到建立的資料夾。
```
cd ~
cd Downloads
sudo tar -zxvf jdk-7u80-linux-x64.tar.gz -C /opt/JDK
```
設定環境變數
```
sudo nano ~/.bashrc
```
在環境變數設定檔案最後面加上這些，加入完成之後Ctrl+O儲存。
```
export JAVA_HOME=/opt/JDK/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH
```
:::info
**※如果要改成java 8的話，在bashrc中改成這樣，就能改成java 8了。**
**※java 8的位置來源是輸入```which java```，得知的。**
```bash=
# 這就是你存Java 8的資料夾位置，每個人都不一樣，要自己改。
# 例如我當初解壓縮到/opt/JDK8中，那就這樣指引。
export JAVA_HOME=/opt/JDK8/jdk1.8.0_401
#export JAVA_HOME=/usr
export PATH=$JAVA_HOME/bin:$PATH
```
:::


執行環境設定。
```
source ~/.bashrc
```

確認java 7版本，確認有成功安裝。
```
java -version
javac -version
```
安裝git。
```
sudo apt-get install git -y
git --version
```
安裝svn。
```
sudo apt install subversion -y
svn --version
```
安裝perl。
```
sudo apt install perl -y
sudo apt list --installed | grep -i perl
```
安裝cpanminus。
```
sudo apt-get install cpanminus -y
```
安裝curl。
```
sudo apt install curl -y
```
安裝maven
```
sudo apt install maven -y
```
安裝ANT。
:::info
這個Ant一樣存放在我的google雲端。
[ant 1.9.16](<https://drive.google.com/file/d/1A-sRvJlBbAfhznxUTfsQlB4KF3jl8Gzq/view?usp=sharing>)
:::

下載ANT的壓縮檔案。
建立一個給ANT的資料夾。
```
cd ../../..
cd opt
sudo mkdir ANT
```
回到Downloads，並解壓縮，之後設定環境變數。
```
cd ~
cd Downloads
sudo tar -zxvf apache-ant-1.9.16-bin.tar.gz -C /opt/ANT/
sudo nano ~/.bashrc
```
將這些輸入到環境變數中。
```
export ANT_HOME=/opt/ANT/apache-ant-1.9.16
export PATH=$ANT_HOME/bin:$PATH
```

執行環境設定，並確認有安裝成功。
```
source ~/.bashrc
ant -version
```

## Defects4J設定
安裝Defects4j，並切換到需要的版本(我的實驗目標要使用v1.1.0，因此切換成1.1.0，如果有要其他的版本，就改成其他的)。
```
git clone https://github.com/rjust/defects4j.git
cd defects4j
git checkout v1.1.0
```
確認切換版本成功。
```
git describe --tags
```


將defects4j進行initial
:::danger
**※因為之前有遇到過在前面加上sudo，導致某些bug_id執行會有問題，因此非必要的話，不要加上sudo。**
:::
```
./init.sh
```
設定defects4j環境變數。
```
sudo nano ~/.bashrc
```
輸入以下環境變數。
```
export PATH=$PATH:~/defects4j/framework/bin
export DEFECTS4J_HOME=~/defects4j
```
執行環境設定，並確認能夠使用defects4j指令。
```
source ~/.bashrc
defects4j
```
::: info
想要知道"defects4j"這個指令在哪裡就輸入"whereis defects4j"，就能取得位置。
:::


建立一個想要存放defects4j的project資料夾，我是在Home下建立一個名叫"**d4j_project**"資料夾中，再建立一個"**Chart**"的資料夾(這個可以打開Document自己手動添加)。

輸入下面指令能夠查看Chart整體的資訊。
```
defects4j info -p Chart
```
輸入下面指令則是查看Chart-1的詳細資訊。
```
defects4j info -p Chart -b 1
```

將Chart-1下載下來。
```
defects4j checkout -p [Project名稱] -v [project的版本][b表示buggy version] -w [要存放的位置，最後的"chart_1_buggy"表示資料夾要存甚麼名稱，可以自訂]
defects4j checkout -p Chart -v 1b -w ~/d4j_project/Chart/chart_1_buggy
```
進到Chart-1的資料夾中，輸入下列指令，編譯以及進行測試。
```
defects4j compile
defects4j test
```

## 自動compile所有的bug-id。
如果ok的話建立一個sh檔，自動把所有的資料下載下來。
建立一個sh檔案，我把sh名稱設定為"**all_D4J**"。
```
touch all_D4J.sh
```
下面為詳細的sh內容。
我的例子是存放在Home目錄下面，並在事前已經手動建立一個"d4j_project"在Home目錄，以及在裡面新增一個"Chart"等等資料夾。
記得要建立各個專案資料夾，不然會出錯。
變數看清楚，常常因為變數問題出錯。
:::spoiler 我的自動將所有Defects4j抓下來的sh檔案，必要的話自行修改需要的資訊。
```bash=
dir=/home/ncyu/d4j_project/ # Store the buggy projects.
dir2=~/d4j_project/

cd defects4j/


proj=Chart
proj2=chart
for bug_id in $(seq 1 26)
do
	defects4j checkout -p $proj -v ${bug_id}b -w ${dir2}${proj}/${proj2}_${bug_id}_buggy
	#cd to checkout folder
	cd ${dir2}${proj}/${proj2}_${bug_id}_buggy 
	defects4j compile
    	defects4j test
    	cd /home/ncyu/defects4j/
done

proj=Closure
proj2=closure
for bug_id in $(seq 1 133)
do
	defects4j checkout -p $proj -v ${bug_id}b -w ${dir2}${proj}/${proj2}_${bug_id}_buggy
	#cd to checkout folder
	cd ${dir2}${proj}/${proj2}_${bug_id}_buggy 
	defects4j compile
    	defects4j test
    	cd /home/ncyu/defects4j/
done

proj=Math
proj2=math
for bug_id in $(seq 1 106)
do
	defects4j checkout -p $proj -v ${bug_id}b -w ${dir2}${proj}/${proj2}_${bug_id}_buggy
	#cd to checkout folder
	cd ${dir2}${proj}/${proj2}_${bug_id}_buggy 
	defects4j compile
    	defects4j test
    	cd /home/ncyu/defects4j/
done

proj=Time
proj2=time
for bug_id in $(seq 1 27)
do
	defects4j checkout -p $proj -v ${bug_id}b -w ${dir2}${proj}/${proj2}_${bug_id}_buggy
	#cd to checkout folder
	cd ${dir2}${proj}/${proj2}_${bug_id}_buggy 
	defects4j compile
    	defects4j test
    	cd /home/ncyu/defects4j/
done

proj=Lang
proj2=lang
for bug_id in $(seq 1 65)
do
	defects4j checkout -p $proj -v ${bug_id}b -w ${dir2}${proj}/${proj2}_${bug_id}_buggy
	#cd to checkout folder
	cd ${dir2}${proj}/${proj2}_${bug_id}_buggy 
	defects4j compile
    	defects4j test
    	cd /home/ncyu/defects4j/
done
```
:::
將sh檔案加入執行權限。
```
chmod +x all_D4J.sh
```

