離開了IDEA,你還會(huì)運(yùn)行JAVA項(xiàng)目嗎?
來(lái)源:https://juejin.cn/post/6986960816264183822
引言
你可能認(rèn)為我是標(biāo)題黨,但是這絕不是危言聳聽。我相信有很多開發(fā)者,早已經(jīng)迷失在IDEA等集成工具的方便之中。
我們正式部署的時(shí)候,如果是Web項(xiàng)目,可以將程序打成WAR包使用tomcat服務(wù)器運(yùn)行我們的項(xiàng)目。不是Web項(xiàng)目可以借助Maven打成JAR包直接去運(yùn)行。
但是在開發(fā)的時(shí)候,我們可能都是用集成工具去執(zhí)行我們的項(xiàng)目,比如我們最熟悉的IDEA、Eclipse,但是脫離他們你還會(huì)執(zhí)行嗎?你們還記得入門時(shí)的JDK命令嗎?
我們知道JAVA是需要編譯的語(yǔ)言,一次編譯處處運(yùn)行的特點(diǎn),是JAVA的特點(diǎn)之一。
我們知道javac是編譯java文件的命令,編譯完的java文件就變成了.class文件,我們可以使用java命令運(yùn)行編譯后的文件,但是實(shí)際開發(fā)中,我們的文件有很多,而且還需要引入很多別人寫好的依賴,當(dāng)不讓你用IDEA去運(yùn)行,而是直接用命令你還會(huì)嗎?
HelloWorld
先從我們最熟悉的HelloWorld開始,代碼如下:
/**
* @author WangScaler
* @date 2021/7/20 16:39
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
復(fù)制代碼
在HelloWorld的當(dāng)前目錄下打開cmd,先編譯javac HelloWorld.java生成了HelloWorld.class的編譯文件,執(zhí)行java HelloWorld成功執(zhí)行并打印hello world。
這個(gè)過(guò)程對(duì)你來(lái)說(shuō),熟悉不能再熟悉,每個(gè)JAVA程序員起初都會(huì)學(xué)習(xí)的JAVA編譯執(zhí)行的過(guò)程。然而給程序加上包名,還能這么輕巧的執(zhí)行嗎?
加包名
在程序上加上包名package com.wangscaler.main;,我們同樣在當(dāng)前文件下執(zhí)行上述的操作。發(fā)現(xiàn)程序報(bào)錯(cuò)了,找不到主類。

這時(shí)候我們得帶著包去執(zhí)行,所以這次我們不在文件所在目錄執(zhí)行文件,而是在包的上層目錄編譯,如上圖,我的編譯路徑應(yīng)該是D:/springboot/javademo/src/main/java在這個(gè)路徑下執(zhí)行
java com.wangscaler.main.HelloWorld是可以正確執(zhí)行的。然而,當(dāng)我們多個(gè)包進(jìn)行了依賴的時(shí)候呢?
包之間進(jìn)行依賴
創(chuàng)建包c(diǎn)om.wangscaler.util,并在此包下創(chuàng)建文件StringUtil.java
package com.wangscaler.util;
/**
* @author WangScaler
* @date 2021/7/20 16:20
*/
public class StringUtil {
public static String change(String a, String b) {
a = b;
return a;
}
}
復(fù)制代碼
更改HelloWorld.java
package com.wangscaler.main;
import com.wangscaler.util.StringUtil;
/**
* @author WangScaler
* @date 2021/7/20 16:39
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
String a = "a";
String b = "b";
String c = StringUtil.change(a, b);
System.out.println(c);
}
}
復(fù)制代碼
這時(shí)候,我們?cè)侔凑丈厦娴姆椒?,在HelloWorld.java所在路徑下執(zhí)行javac HelloWorld.java,就不行了,提示如下錯(cuò)誤:
HelloWorld.java:3: 錯(cuò)誤: 程序包c(diǎn)om.wangscaler.util不存在
import com.wangscaler.util.StringUtil;
^
HelloWorld.java:16: 錯(cuò)誤: 找不到符號(hào)
String c = StringUtil.change(a, b);
^
符號(hào): 變量 StringUtil
位置: 類 HelloWorld
2 個(gè)錯(cuò)誤
復(fù)制代碼
原因是他不知道其他包在哪。那么我們?cè)趕rc/main/java下,編譯可以嗎?在src/main/java下執(zhí)行
javac com/wangscaler/main/HelloWorld.java發(fā)現(xiàn)是可以,然后執(zhí)行 java com.wangscaler.main.HelloWorld也是可以正確執(zhí)行的。
那么我們不僅依賴我們自己的包,還依賴了別人的包,該如何編譯呢?
Maven引入依賴
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
復(fù)制代碼
更改HelloWorld.java
package com.wangscaler.main;
import com.wangscaler.util.StringUtil;
import org.apache.commons.lang.StringUtils;
/**
* @author WangScaler
* @date 2021/7/20 16:39
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
String a = "a";
String b = "b";
String c = StringUtil.change(a, b);
System.out.println(c);
System.out.println(StringUtils.equals(c,b));
}
}
復(fù)制代碼
在src/main/java下執(zhí)行javac com/wangscaler/main/HelloWorld.java發(fā)現(xiàn)出現(xiàn)了錯(cuò)誤
com\wangscaler\main\HelloWorld.java:4: 錯(cuò)誤: 程序包org.apache.commons.lang不存在
import org.apache.commons.lang.StringUtils;
^
com\wangscaler\main\HelloWorld.java:18: 錯(cuò)誤: 找不到符號(hào)
System.out.println(StringUtils.equals(c,b));
^
符號(hào): 變量 StringUtils
位置: 類 HelloWorld
2 個(gè)錯(cuò)誤
復(fù)制代碼
上部引入我們自己的包,我們編譯的時(shí)候找不到,我們提到上層去編譯可以成功編譯。而這次我們maven引入的包在其他盤,我們總不能還是和上次一樣往上提路徑了,那么我們?nèi)绾螌⒁氲膉ar包告訴它呢?
使用javac -cp命令cp是classpath的縮寫,所以你也可以使用javac -classpath。命令如下:
javac -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" D:/springboot/javademo/src/main/java/com/wangscaler/main/HelloWorld.java
復(fù)制代碼
需要注意的是:你必須指定你文件的絕對(duì)路徑,而且你必須知道你引入的包的位置。向我們直接在項(xiàng)目引入jar包的話,就更容易找到j(luò)ar包的位置。
執(zhí)行
java -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" com.wangscaler.main.HelloWorld
復(fù)制代碼
運(yùn)行編譯文件,這時(shí)候也得帶著依賴,否則還是報(bào)錯(cuò),因?yàn)榫幾g的時(shí)候,不會(huì)把依賴編譯進(jìn)你的項(xiàng)目中。
命令技巧
將編譯文件放入指定的文件夾
像IDEA編譯的文件夾叫/target,所以我們也指定編譯的文件到/target。
在src下創(chuàng)建文件夾target,并執(zhí)行。
javac -d D:/springboot/javademo/src/target -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" D:/springboot/javademo/src/main/java/com/wangscaler/main/HelloWorld.java
復(fù)制代碼
編譯的文件將放在target的路徑下。我們?cè)趖arget下執(zhí)行
java -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" com.wangscaler.main.HelloWorld
復(fù)制代碼
成功運(yùn)行。
在項(xiàng)目其他路徑下編譯
上述編譯過(guò)程都是在包名的上層路徑,即src/main/java下編譯的,如果我們想在src編譯怎么辦呢?我們之前在src/main/java編譯是因?yàn)?,如果不這樣的話,找不到其他的包,所以我們?nèi)绻嬖V它這些包的位置,那么就可以了。
dir *.java/s/b > srclist.txt將我們.java文件路徑寫入到srclist.txt文件中,然后執(zhí)行編譯
javac -d D:/springboot/javademo/src/target -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" @srclist.txt
復(fù)制代碼
根據(jù)這個(gè)文件進(jìn)行編譯,成功編譯。
在其他路徑運(yùn)行項(xiàng)目
我們上述的運(yùn)行項(xiàng)目,都是在編譯文件的根路徑上進(jìn)行運(yùn)行的,那么我們?cè)谄渌恢每刹豢梢??也是可以的?/p>
只需要把編譯的路徑放入到cp參數(shù)里即可,即
java -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\springboot\javademo\src\target" com.wangscaler.main.HelloWorld
復(fù)制代碼
其他命令
命令有很多,如果你不記得,快去翻翻文檔吧。
參考文檔:
Java命令詳解 命令行中 javac、java、javap 的使用詳解 官方文檔
Maven打成JAR包
真香定律,哈哈
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.wangscaler.main.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
復(fù)制代碼
執(zhí)行mvn package打包。
「技術(shù)分享」某種程度上,是讓作者和讀者,不那么孤獨(dú)的東西。歡迎關(guān)注我的微信公眾號(hào):「Kirito的技術(shù)分享」
- END -
