1. 程式人生 > 程式設計 >手動編譯並執行Java專案實現過程解析

手動編譯並執行Java專案實現過程解析

  現在Java開發基本上就是IDE除錯,如果跨平臺打個jar包過去執行一般就可以了,但是有些情況比如需要引入外部依賴的時候,這個時候是不能直接執行的,還需要引入一些外部的引數,並不是簡單的javac和java的關係了,下面來詳細說一下

  一般情況下,在本地都是使用eclipse開發工具進行開發,很多東西基本上就不用我們考慮了,如果我們要將專案放到Linux下執行的話,那麼就需要進行轉移的操作,當然有Maven、Ant這樣的自動化部署工具,簡直是太方便了,為了做到更進一步認識的話,我們純手動的去打包一個java的專案

  首先,專案名稱為JarTest,在eclipse結構如下圖所示:

  手動編譯並執行Java專案實現過程解析

  包名和類名都看的非常清楚了,App是主類,包含有main方法;TestBean是一個JavaBean實體;TestService是一個利用TestBean進行簡單計算的類,那麼各個類的程式碼如下:

App.java

package net.javatest.package1;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;
import net.javatest.package3.TestService;

public class App {

  public static void main(String[] args) {
    List<TestBean> tb = new ArrayList<TestBean>();
    String[] names = {"hacker","nginx","github","hadoop","storm","solr","kafka","spark"};
    for(int i = 0;i < names.length;i++) {
      tb.add(new TestBean(String.valueOf(i),names[i]));
    }
    List<String> namelist = TestService.nameList(tb);
    for(int i = 0;i < namelist.size();i++) {
      System.out.println(namelist.get(i));
    }
  }

}

TestBean.java

package net.javatest.package2;

public class TestBean {
  private String id;
  private String name;

  public TestBean() {

  }

  public TestBean(String id,String name) {
    this.id = id;
    this.name = name;
  }

  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

TestService.java

package net.javatest.package3;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;

public class TestService {

  public static List<String> nameList(List<TestBean> tbs) {
    List<String> names = new ArrayList<String>();
    for(TestBean tb : tbs) {
      names.add(tb.getName());
    }
    return names;
  }

}

  檔案就是這樣,源程式都不依賴於外部包,其實在eclipse中自動已經進行編譯成class了,我們可以直接使用class檔案,在這裡我們直接使用原始檔進行編譯,首先打包上傳專案,壓縮成JarTest.zip上傳到伺服器,

  手動編譯並執行Java專案實現過程解析

  接下來解壓釋放目錄:

unzip JarTest.zipcd JarTest/src

  因為我們打包專案的時候打包的專案外層目錄,所以解壓出來需要進入JarTest這個目錄,我們的原始碼檔案在src中,現在開始編譯:

javac net/javatest/package1/App.java net/javatest/package2/TestBean.java net/javatest/package3/TestService.java

  這樣回車之後,沒任何提示就編譯好了,現在每個包下都有一個和原始檔對應的class檔案,如果感覺上面太長太麻煩,可以使用萬用字元全部搞定編譯:

javac net/javatest/package*/*.java

  這樣就全部編譯完了,現在我們可以執行一下看一下執行結果,

java net.javatest.package1.App

  這樣就可以直接App的main方法了,接下來可以進行打包,打成一個jar包,用起來更方便,我們可以用eclipse打成jar包看一下目錄結構,我們會發現jar包如果解壓出來之後,會看到META-INF的一個目錄,這個目錄中有一個MANIFEST.MF檔案,這個檔案就是定義如何匯入外部jar包以及主類的存在位置,接下來我們自己編寫MANIFEST.MF這個檔案,我們使用命令:vim MANIFEST.MF建立一個檔案,直接在當前也就是src目錄下建立即可,然後我們編輯以下內容:

Manifest-Version: 1.0
Main-Class: net.javatest.package1.App

  第一行是固定格式,定義版本號,第二行就是指明主類的位置可以用空格分開多個宣告,注意冒號之後要有一個空格;然後注意的就是後面需要空出2行,輸入兩次換號即可,然後我們儲存退出,執行下面命令打包:

jar -cvfm jartest.jar MANIFEST.MF net/

  其中jartest.jar就是要打的包,net就是我們的包目錄,現在我們就可以看到一個jartest.jar這樣一個檔案,

手動編譯並執行Java專案實現過程解析

  然後我們執行下面命令就可以執行該jar檔案了

java -jar jartest.jar

  如果jar包中具有多個包含main方法的類時,需要指定Main-Class定義的其中之一,命令如下:

java -jar jartest.jar net.javatest.package1.App

  以上是沒有任何外部依賴的Java專案的執行,如果有其他依賴的話,具體執行情況如下,我們將剛才打好的jar包下載,然後新建另外一個專案去呼叫jar包裡面類中的方法,專案如下:

  手動編譯並執行Java專案實現過程解析

  只有一個主類,程式碼很簡單,就是呼叫了jartest.jar的方法,JarTest2.java程式碼如下:

package net.javatest;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;
import net.javatest.package3.TestService;

public class JarTest2 {

  public static void main(String[] args) {
    List<TestBean> tb = new ArrayList<TestBean>();
    String[] names = {"test2","hbase",names[i]));
    }
    List<String> namelist = TestService.nameList(tb);
    for(int i = 0;i < namelist.size();i++) {
      System.out.println(namelist.get(i));
    }
  }

}

  這時候將jartest.jar匯入專案的path裡面,編譯的時候就不會出錯了,我們繼續上傳該專案,進行編譯,編譯命令如下:

javac -classpath ../lib/jartest.jar: net/javatest/JarTest2.java

  匯入多個外部jar包時需要用:分割,並且最後一個後面必須有冒號,-classpath引數用於指定外部jar包和類檔案都可以,執行的時候也需要進行包含,執行命令如下:

java -classpath ../lib/jartest.jar: net.javatest.JarTest2

  接下來將專案打包,打包之前同樣執行vim MANIFEST.MF編輯檔案如下:

Manifest-Version: 1.0
Main-Class: net.javatest.JarTest2
Class-Path: lib/jartest.jar

  這裡第三行匯入外部jar包檔案,多個檔案依賴用空格分隔,目錄無所謂這裡是相對於打包後jar檔案的目錄,就是說lib目錄和打包後的jar檔案在一個目錄即可正常執行,接下來打包:

jar -cvfm jartest2.jar MANIFEST.MF net/

  打包後直接使用java -jar jattest.jar是不能執行的,需要將剛才的lib複製過來才可以,執行下面命令:

cd ..cp -r lib/ src/

  複製剛才的lib目錄過來即可,現在執行java -jar jartest2.jar即可正常運行了

  綜合來說,對於一個複雜的專案,編譯以及執行時除了系統類庫的支援,還需要引入外部jar包或者類檔案才能保證整個專案的正常執行,具體的執行流程需要不斷地去熟悉

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。