「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!」html
你可能認爲我是標題黨,可是這毫不是危言聳聽。我相信有不少開發者,早已經迷失在IDEA等集成工具的方便之中。前端
咱們正式部署的時候,若是是Web項目,能夠將程序打成WAR包使用tomcat服務器運行咱們的項目。不是Web項目能夠藉助Maven打成JAR包直接去運行。java
可是在開發的時候,咱們可能都是用集成工具去執行咱們的項目,好比咱們最熟悉的IDEA、Eclipse,可是脫離他們你還會執行嗎?大家還記得入門時的JDK命令嗎?程序員
咱們知道JAVA是須要編譯的語言,一次編譯到處運行的特色,是JAVA的特色之一。spring
咱們知道javac是編譯java文件的命令,編譯完的java文件就變成了.class文件,咱們能夠使用java命令運行編譯後的文件,可是實際開發中,咱們的文件有不少,並且還須要引入不少別人寫好的依賴,當不讓你用IDEA去運行,而是直接用命令你還會嗎?apache
先從咱們最熟悉的HelloWorld開始,代碼以下:windows
/** * @author WangScaler * @date 2021/7/20 16:39 */
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}
複製代碼
在HelloWorld的當前目錄下打開cmd,先編譯javac HelloWorld.java
生成了HelloWorld.class的編譯文件,執行java HelloWorld
成功執行並打印hello world
。後端
這個過程對你來講,熟悉不能再熟悉,每一個JAVA程序員起初都會學習的JAVA編譯執行的過程。然而給程序加上包名,還能這麼輕巧的執行嗎?tomcat
在程序上加上包名package com.wangscaler.main;
,咱們一樣在當前文件下執行上述的操做。發現程序報錯了,找不到主類。springboot
這時候咱們得帶着包去執行,因此此次咱們不在文件所在目錄執行文件,而是在包的上層目錄編譯,如上圖,個人編譯路徑應該是D:/springboot/javademo/src/main/java
在這個路徑下執行
java com.wangscaler.main.HelloWorld
是能夠正確執行的。然而,當咱們多個包進行了依賴的時候呢?
建立包com.wangscaler.util,並在此包下建立文件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;
}
}
複製代碼
更改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);
}
}
複製代碼
這時候,咱們再按照上面的方法,在HelloWorld.java所在路徑下執行javac HelloWorld.java
,就不行了,提示以下錯誤:
HelloWorld.java:3: 錯誤: 程序包com.wangscaler.util不存在
import com.wangscaler.util.StringUtil;
^
HelloWorld.java:16: 錯誤: 找不到符號
String c = StringUtil.change(a, b);
^
符號: 變量 StringUtil
位置: 類 HelloWorld
2 個錯誤
複製代碼
緣由是他不知道其餘包在哪。那麼咱們在src/main/java下,編譯能夠嗎?在src/main/java下執行
javac com/wangscaler/main/HelloWorld.java
發現是能夠,而後執行 java com.wangscaler.main.HelloWorld
也是能夠正確執行的。
那麼咱們不只依賴咱們本身的包,還依賴了別人的包,該如何編譯呢?
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
複製代碼
更改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));
}
}
複製代碼
在src/main/java下執行javac com/wangscaler/main/HelloWorld.java
發現出現了錯誤
com\wangscaler\main\HelloWorld.java:4: 錯誤: 程序包org.apache.commons.lang不存在
import org.apache.commons.lang.StringUtils;
^
com\wangscaler\main\HelloWorld.java:18: 錯誤: 找不到符號
System.out.println(StringUtils.equals(c,b));
^
符號: 變量 StringUtils
位置: 類 HelloWorld
2 個錯誤
複製代碼
上部引入咱們本身的包,咱們編譯的時候找不到,咱們提到上層去編譯能夠成功編譯。而此次咱們maven引入的包在其餘盤,咱們總不能仍是和上次同樣往上提路徑了,那麼咱們如何將引入的jar包告訴它呢?
使用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
複製代碼
須要注意的是:你必須指定你文件的絕對路徑,並且你必須知道你引入的包的位置。向咱們直接在項目引入jar包的話,就更容易找到jar包的位置。
執行
java -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" com.wangscaler.main.HelloWorld
複製代碼
運行編譯文件,這時候也得帶着依賴,不然仍是報錯,由於編譯的時候,不會把依賴編譯進你的項目中。
像IDEA編譯的文件夾叫/target,因此咱們也指定編譯的文件到/target。
在src下建立文件夾target,並執行。
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
複製代碼
編譯的文件將放在target的路徑下。咱們在target下執行
java -cp "C:\Users\ZYPC.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;" com.wangscaler.main.HelloWorld
複製代碼
成功運行。
上述編譯過程都是在包名的上層路徑,即src/main/java下編譯的,若是咱們想在src編譯怎麼辦呢?咱們以前在src/main/java編譯是由於,若是不這樣的話,找不到其餘的包,因此咱們若是告訴它這些包的位置,那麼就能夠了。
dir *.java/s/b > srclist.txt
將咱們.java文件路徑寫入到srclist.txt文件中,而後執行編譯
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
複製代碼
根據這個文件進行編譯,成功編譯。
咱們上述的運行項目,都是在編譯文件的根路徑上進行運行的,那麼咱們在其餘位置可不能夠?也是能夠的。
只須要把編譯的路徑放入到cp參數裏便可,即
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
複製代碼
命令有不少,若是你不記得,快去翻翻文檔吧。
參考文檔:
真香定律,哈哈
<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>
複製代碼
執行mvn package
打包。