[Java] Gradle – Create Java Directory Script

參考良葛格的簡報:http://www.codedata.com.tw/java/groovy-gradle-abc/

在 build.gradle 中可以加入這個 task:

task "create-dirs" << {
    sourceSets*.java.srcDirs*.each { it.mkdirs() }
    sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

然後就可以用 gradle create-dirs 自動化建立專案目錄

~/Desktop/gedo -->gradle create-dirs
:create-dirs

BUILD SUCCESSFUL

Total time: 4.926 secs
~/Desktop/gedo -->tree
.
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources

7 directories, 1 file

額外參考討論:https://issues.gradle.org/browse/GRADLE-1289

[Java] Gradle – Create Java Project

  1. mkdir first
  2. cd first
  3. vim build.gradle
  4. add apply plugin: 'java' into build.gradle, then save file and leave.
  5. gradle build, This will create directory .gradle and build:
 ~/Desktop/Gradle/first -->gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 3.712 secs

上面依序是編譯和打包專案時會做的 tasks,可以用 gradle tasks 來查看有哪些 task 可以指定,這裡因為我們指定到 build,所以就依序做到 build

 ~/Desktop/Gradle/first -->ll
total 8
drwxr-xr-x  5 veck  staff  170 Nov  5 03:15 .
drwxr-xr-x  6 veck  staff  204 Nov  5 03:13 ..
drwxr-xr-x  3 veck  staff  102 Nov  5 03:15 .gradle
drwxr-xr-x  4 veck  staff  136 Nov  5 03:15 build
-rw-r--r--  1 veck  staff   22 Nov  5 03:14 build.gradle
 ~/Desktop/Gradle/first -->tree
.
├── build
│   ├── libs
│   │   └── first.jar
│   └── tmp
│       └── jar
│           └── MANIFEST.MF
└── build.gradle

可以見到,gradle 會自動打包成 jar 檔和建立 MANIFEST.MF 檔,不過正常應該是,要先建立好 java 專案,根據官方文件說明,gradle 預設你的 Java 專案結構長這樣:

├── build.gradle
└── src
    ├── main
    │   ├── java
    │   └── resources
    ├── sourceSet
    │   ├── java
    │   └── resource
    └── test
        ├── java
        └── resources

我先手動建立,Gradle 好像沒有自動化建立專案的功能(? 或是有工具?應該也可用 maven 去建立?),建立好以後,我們在 src/main/java 下建立 HelloWorld.java,簡單的加入 HelloWorld 的程式碼,並且在 build.gradle 中加入 apply plugin: 'java',最後的目錄結構會長這樣:

 ~/Desktop/Gradle/first -->tree
.
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── HelloWorld.java
    │   └── resources
    ├── sourceSet
    │   ├── java
    │   └── resource
    └── test
        ├── java
        └── resources

10 directories, 2 files

接著在用 gradle build:

 ~/Desktop/Gradle/first -->gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 4.572 secs 
 ~/Desktop/Gradle/first -->tree
.
├── build
│   ├── classes
│   │   └── main
│   │       └── HelloWorld.class
│   ├── dependency-cache
│   ├── libs
│   │   └── first.jar
│   └── tmp
│       ├── compileJava
│       └── jar
│           └── MANIFEST.MF
├── build.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── HelloWorld.java
    │   └── resources
    ├── sourceSet
    │   ├── java
    │   └── resource
    └── test
        ├── java
        └── resources

18 directories, 5 files

但是這樣子還不能夠直接下 java -jar first.jar 來執行測試我們的程式,需要在 build.gradle 中加入:

jar {
    manifest {
        attributes 'Main-Class': 'HelloWorld'
    }
}

然後再 build 一次,最後進到 build/libs 中,就可以執行 java -jar first.jar 來執行程式了

~/Desktop/Gradle/first/build/libs -->java -jar first.jar
Hello World!!!

但是這樣很不方便,想要更自動化,可以向 maven 一樣在 pom.xml 中寫 … 的話,Gradle 也可以,只要在 build.gradle 中加入以下的 task:

task runJar(dependsOn:jar) << {
  javaexec { main="-jar"; args jar.archivePath } 
}

接著每次重新編譯完後,就可以值些輸入 gradle runjar 來執行編譯包裝後的 JAR 檔案了

螢幕快照 2014-11-05 上午9.07.04.png

Note: 在 build.gradle 中加入 apply plugin: 'eclipse' 可以產生 eclipse 的專案,可以加在 apply plugin: 'java'

References:

  1. http://www.gradle.org/docs/current/userguide/tutorial_java_projects.html
  2. http://www.gradle.org/docs/current/userguide/java_plugin.html#N12119
  3. http://blog.denevell.org/gradle-run-jar-file.html

Apache Lucene-4.3.0 Note

     

  1. 先到官方網站下載 Lucene (目前為 4.3.0),Windows 上下載 .zip
  2. 下載回來以後解壓縮 .zip
  3. 根據官網說明,進入解壓的資料夾以後,分別在 /core、/demo、/analysis/common 和 /queryparser (不是 /queries) 四個子資料夾中可以找到 lucene-core-4.3.0.jar、lucene-demo-4.3.0.jar、 lucene-analyzers-common-4.3.0.jar 和 lucene-queryparser-4.3.0.jar 四個 jar 檔案 (tar.gz 會有點不一樣)
  4. 將這四個檔案 “copy" 到你安裝 JDK 的 lib 資料夾中 (*1)
  5. 將這四個檔案在 lib 中的絕對路徑加到 Java 的 CLASSPATH 設定中 (例如:C:\Program Files\Java\jdk1.7.0_05\lib\lucene-core-4.3.0.jar,別忘記要加 .jar 喔!如果你是直接複製檔名的話)
  6. 測試:打開 cmd,輸入:

                java org.apache.lucene.demo.SearchFiles

                java org.apache.lucene.demo.IndexFiles

↑ 測試設定結果 ↑

  1. 設定好 CLASSPATH (也就是出現上面的結果,而非找不到類別之類的訊息)
  2. 在你想要建立目錄的地方開一個資料夾,ex. C:\Users\Veck\Desktop\Apache_Lucene\dir,dir 就是我建立的資料夾
  3. 以我建立的目錄為例,在 cmd 輸入: (*2)
           java org.apache.lucene.demo.IndexFiles -docs Apache_Lucene\dir
4. 成功以後,與 Apache_Lucene 相同的目錄底下 (我這邊就是 Desktop) 會多出一個 index 資料夾
5. 其中 index 資料夾包含了兩個檔案:segments.gen 和 segments_1

1. 要利用 demo 工具測試 Search,先進入建立的目錄 dir 中任意建立一些檔案 (例如這邊的 dct.txt 和 tet.txt) 

2. 接著在檔案裏面任意輸入一些內容 ( 記得要存檔!)

3. 回到 cmd,輸入:
 
     java org.apache.lucene.demo.IndexFiles Apache_Lucene\dir
 
    會出現 indexing 和 adding 的訊息,接著再輸入:

    java org.apache.lucene.demo.SearchFiles

    就會出現 “Enter query:" 的訊息等待你輸入要搜尋檔案內文的資料
    (Lucene是全文搜尋工具,非檔案搜尋工具)

   例如輸入剛剛在文件中的 “lucene",會檢索到一個在索引目錄 dir 中含有這個詞的 ter.txt
   又如輸入剛剛在文件中的 “note",會檢索到一個在索引目錄 dir 中含有這個詞的 dct.txt


1.Apache Overview:

2.Ubuntu Reference、(*1) 參考: http://blog.csdn.net/wuyanyi/article/details/7873121

3. (*2) 參考:
 http://www.zzbaike.com/wiki/Lucene%E5%85%A5%E9%97%A8%E4%BD%BF%E7%94%A8

4. Linux Reference、參考:
http://blog.longwin.com.tw/2007/07/search_engine_lucene_study_2007/

5. 中文檢索參考(上述介紹方法還無法正確檢索含中文的檔案內容):http://kb.trisugar.com/node/9751

———————————————————————————————————————————————
*1 官網說明:Put all four of these files in your Java CLASSPATH.』
意思是要將這四個檔案放到你設定 Java 的 CLASSPASS 那個資料夾中,然後我這邊的測試,還必須將這四個檔案的絕對路徑加到 CLASSPATH 中

*2 官網說明:『java org.apache.lucene.demo.IndexFiles -docs {path-to-lucene}/src 』
後面這一段 {path-to-lucene}/src,分別是要輸入『{以現在所在目錄下到剛剛建立的目錄的中間路徑} / 剛剛建立的目錄名稱』,例如我現在在 Desktop,則剛剛建立的目錄叫做 dir,放在 Apache_Lucene底下,所以是『Apache_Lucene\dir』,注意 “/" 變成 “\" 了喔!因為是路徑名稱

Eclipse 安裝套件錯誤訊息 – Contacting Software Sites has encountered a problem

原因:未查證

狀況:當你在 Eclipse 的 Install New Software 輸入套件網址,卻出現下列訊息"Contacting Software Sites has encountered a problem",而無法安裝

解決方法:
   1. 打開你的 Eclipse安裝資料夾
   2. 找到 eclipse.ini 這個檔案
   3. 加入這行:-Djava.net.preferIPv4Stack=true
4. 重新啟動 Eclipse,再次進入 Install New Software 就不會有這個錯誤訊息了

~Java GUI~ AWT vs Swing

Frame、Panel、Dialog、InterFrame、Window、Applet 都是容器

通常有J開頭的,如JFrame、JDialog、JPanel、JInterFrame、JWindow、JApplet…等元件都是屬於 swing 類別
而沒有J開頭的,如Frame、Panel、Dialog、InterFrame、Window、Applet…等元件都是屬於 awt 類別

其中Applet、JApplet、swing與awt的繼承關係為:
java.awt.Panel <– java.applet.Applet <– javax.swing.JApple

通常一個GUI分為兩個部分:Container + Component

以swing為例,swing可以被實體化出來的:

容器(Container):
JFrame :General window
JDialog :Dialog window
JWindow :General window but dosen’t have title and other basic component
JInterFrame :用來建立子視窗
JPanel :用來建立視窗中的面板
JApplet :瀏覽器使用的視窗化容器


元件(Component):
JButton
JMenuItem
JCheckbox
JRadioButton
JComboBox
JLabel
JList
JMenuBar
JPopupMenu
JScrollBar
JEditorPane
JTextArea
JTextField
JToolBar

*建立一個視窗最基本的幾行指令:
1. 實體化一個容器: JFrame myFrame = new JFrame(“Title");
2. 設定視窗大小: myFrame.setSize(a,b);
3. 設定視窗是否顯示:myFrame.setVisible(true);
4. 設定當使用者關閉視窗,即結束程式:myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
————-至此可以建立一個什麼功用都沒有的視窗————-
5. 加入元件到視窗中:
(1) JButton myButton = new JButton(“Click");
(2) myFrame.getContentPane().add(myButton);
^^^^^^^^^^^^^^^^
swing 的物件需要先以這個方法得到一個物件,才能加入元件
awt 的物件則可以直接加入, myFrame.add(myButton);

*首先以AWT的陽春視窗做示範:

import java.awt.*;

import java.awt.event.*;

public class testAWT
{
public static void main(String[] args)
{
Frame myFrame = new Frame("Title");

myFrame.addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0); }
}
);

Button myButton = new Button("Click");

myFrame.add(myButton);

myFrame.setSize(250,250);
myFrame.setVisible(true);





}
}


/*
Because AWT does not have "setDefaultCloseOperation();" or such functions to exit the program when user click the exit button, you have to include the class "java.awt.event.*;" to implement windowListener to achieve the function.
*/

編譯出來會有兩個class,一個是 testAWT.class 和 testAWT$1.class
使用 java 執行的時候,不能夠只有其中一個class 這樣子會找不到main


執行結果如下:

(接下來是 Swing….continue)


~Java~ 提示字符讀取輸入

大家有沒有一個疑問
為什麼

public static void main(String args[]){   }
                                        ↑↑↑
                                        這是做什麼的?

今天看到一個程式內的應用,所以就自己想到這個想法實作一遍
以下是我的程式碼片段:

 public class argsStream
{
public static void main(String args[])
{
for(int i=0;i<args.length;i++)
{ System.out.println(args[i]); }
}
}

要測試時,請用命令提示字元,輸入java argsStream
當你按下Enter會發現程式沒有作用

接著請你再輸入一次,但是這一次,請輸入 java argsStream Iamnotcool
按下Enter後
C:\User\Desktop>java argsStream iamnotcool   

就會出現你所輸入的字串!!!
所以知道為什麼了吧!
也就是說
args[]是執行程式時,你所附加輸入的參數
就像你輸入{ javac 程式名稱.java}
                         ↑        ↑
                    class   mainOfJava’s String args[]
                      java