# 新的虛擬機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 ```