手動編譯并運(yùn)行Java項(xiàng)目實(shí)現(xiàn)過程解析
現(xiàn)在Java開發(fā)基本上就是IDE調(diào)試,如果跨平臺打個jar包過去運(yùn)行一般就可以了,但是有些情況比如需要引入外部依賴的時候,這個時候是不能直接運(yùn)行的,還需要引入一些外部的參數(shù),并不是簡單的javac和java的關(guān)系了,下面來詳細(xì)說一下
一般情況下,在本地都是使用eclipse開發(fā)工具進(jìn)行開發(fā),很多東西基本上就不用我們考慮了,如果我們要將項(xiàng)目放到Linux下運(yùn)行的話,那么就需要進(jìn)行轉(zhuǎn)移的操作,當(dāng)然有Maven、Ant這樣的自動化部署工具,簡直是太方便了,為了做到更進(jìn)一步認(rèn)識的話,我們純手動的去打包一個java的項(xiàng)目
首先,項(xiàng)目名稱為JarTest,在eclipse結(jié)構(gòu)如下圖所示:

包名和類名都看的非常清楚了,App是主類,包含有main方法;TestBean是一個JavaBean實(shí)體;TestService是一個利用TestBean進(jìn)行簡單計(jì)算的類,那么各個類的代碼如下:
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;
}
}
文件就是這樣,源程序都不依賴于外部包,其實(shí)在eclipse中自動已經(jīng)進(jìn)行編譯成class了,我們可以直接使用class文件,在這里我們直接使用源文件進(jìn)行編譯,首先打包上傳項(xiàng)目,壓縮成JarTest.zip上傳到服務(wù)器,

接下來解壓釋放目錄:
unzip JarTest.zipcd JarTest/src
因?yàn)槲覀兇虬?xiàng)目的時候打包的項(xiàng)目外層目錄,所以解壓出來需要進(jìn)入JarTest這個目錄,我們的源代碼文件在src中,現(xiàn)在開始編譯:
javac net/javatest/package1/App.java net/javatest/package2/TestBean.java net/javatest/package3/TestService.java
這樣回車之后,沒任何提示就編譯好了,現(xiàn)在每個包下都有一個和源文件對應(yīng)的class文件,如果感覺上面太長太麻煩,可以使用通配符全部搞定編譯:
javac net/javatest/package*/*.java
這樣就全部編譯完了,現(xiàn)在我們可以執(zhí)行一下看一下運(yùn)行結(jié)果,
java net.javatest.package1.App
這樣就可以直接App的main方法了,接下來可以進(jìn)行打包,打成一個jar包,用起來更方便,我們可以用eclipse打成jar包看一下目錄結(jié)構(gòu),我們會發(fā)現(xiàn)jar包如果解壓出來之后,會看到META-INF的一個目錄,這個目錄中有一個MANIFEST.MF文件,這個文件就是定義如何導(dǎo)入外部jar包以及主類的存在位置,接下來我們自己編寫MANIFEST.MF這個文件,我們使用命令:vim MANIFEST.MF創(chuàng)建一個文件,直接在當(dāng)前也就是src目錄下創(chuàng)建即可,然后我們編輯以下內(nèi)容:
Manifest-Version: 1.0
Main-Class: net.javatest.package1.App
第一行是固定格式,定義版本號,第二行就是指明主類的位置可以用空格分開多個聲明,注意冒號之后要有一個空格;然后注意的就是后面需要空出2行,輸入兩次換號即可,然后我們保存退出,執(zhí)行下面命令打包:
jar -cvfm jartest.jar MANIFEST.MF net/
其中jartest.jar就是要打的包,net就是我們的包目錄,現(xiàn)在我們就可以看到一個jartest.jar這樣一個文件,

然后我們執(zhí)行下面命令就可以運(yùn)行該jar文件了
java -jar jartest.jar
如果jar包中具有多個包含main方法的類時,需要指定Main-Class定義的其中之一,命令如下:
java -jar jartest.jar net.javatest.package1.App
以上是沒有任何外部依賴的Java項(xiàng)目的運(yùn)行,如果有其他依賴的話,具體運(yùn)行情況如下,我們將剛才打好的jar包下載,然后新建另外一個項(xiàng)目去調(diào)用jar包里面類中的方法,項(xiàng)目如下:

只有一個主類,代碼很簡單,就是調(diào)用了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","nginx","hbase","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));
}
}
}
這時候?qū)artest.jar導(dǎo)入項(xiàng)目的path里面,編譯的時候就不會出錯了,我們繼續(xù)上傳該項(xiàng)目,進(jìn)行編譯,編譯命令如下:
javac -classpath ../lib/jartest.jar: net/javatest/JarTest2.java
導(dǎo)入多個外部jar包時需要用:分割,并且最后一個后面必須有冒號,-classpath參數(shù)用于指定外部jar包和類文件都可以,運(yùn)行的時候也需要進(jìn)行包含,運(yùn)行命令如下:
java -classpath ../lib/jartest.jar: net.javatest.JarTest2
接下來將項(xiàng)目打包,打包之前同樣執(zhí)行vim MANIFEST.MF編輯文件如下:
Manifest-Version: 1.0
Main-Class: net.javatest.JarTest2
Class-Path: lib/jartest.jar
這里第三行導(dǎo)入外部jar包文件,多個文件依賴用空格分隔,目錄無所謂這里是相對于打包后jar文件的目錄,就是說lib目錄和打包后的jar文件在一個目錄即可正常運(yùn)行,接下來打包:
jar -cvfm jartest2.jar MANIFEST.MF net/
打包后直接使用java -jar jattest.jar是不能執(zhí)行的,需要將剛才的lib復(fù)制過來才可以,執(zhí)行下面命令:
cd ..cp -r lib/ src/
復(fù)制剛才的lib目錄過來即可,現(xiàn)在執(zhí)行java -jar jartest2.jar即可正常運(yùn)行了
綜合來說,對于一個復(fù)雜的項(xiàng)目,編譯以及運(yùn)行時除了系統(tǒng)類庫的支持,還需要引入外部jar包或者類文件才能保證整個項(xiàng)目的正常運(yùn)行,具體的執(zhí)行流程需要不斷地去熟悉
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis返回int或者Integer類型報錯的解決辦法
這篇文章主要介紹了Mybatis返回int或者Integer類型報錯的解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
java Swing JFrame框架類中setDefaultCloseOperation的參數(shù)含義與用法示例
這篇文章主要介紹了java Swing JFrame框架類中setDefaultCloseOperation的參數(shù)含義與用法,結(jié)合實(shí)例形式分析了Swing組件的JFrame框架類中setDefaultCloseOperation方法的簡單使用技巧,需要的朋友可以參考下2017-11-11
java中MultipartFile類型轉(zhuǎn)為File類型的4種方法
Spring提供了一個MultipartFile接口來處理文件上傳,但有時候我們需要將MultipartFile轉(zhuǎn)換為File來進(jìn)行一些特定的操作,比如保存文件到本地或者進(jìn)行文件的處理等,這篇文章主要給大家介紹了關(guān)于java中MultipartFile類型轉(zhuǎn)為File類型的4種方法,需要的朋友可以參考下2024-09-09
Spring Boot超詳細(xì)講解請求處理流程機(jī)制
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起分析請求處理流程機(jī)制2022-07-07
詳解Eclipse提交項(xiàng)目到GitHub以及解決代碼沖突
這篇文章主要介紹了詳解Eclipse提交項(xiàng)目到GitHub以及解決代碼沖突,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03

