離開了IDEA,你還會運行JAVA項目嗎?

「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!html

離開了IDEA,你還會運行JAVA項目嗎?

引言

你可能認爲我是標題黨,可是這毫不是危言聳聽。我相信有不少開發者,早已經迷失在IDEA等集成工具的方便之中。前端

咱們正式部署的時候,若是是Web項目,能夠將程序打成WAR包使用tomcat服務器運行咱們的項目。不是Web項目能夠藉助Maven打成JAR包直接去運行。java

可是在開發的時候,咱們可能都是用集成工具去執行咱們的項目,好比咱們最熟悉的IDEA、Eclipse,可是脫離他們你還會執行嗎?大家還記得入門時的JDK命令嗎?程序員

咱們知道JAVA是須要編譯的語言,一次編譯到處運行的特色,是JAVA的特色之一。spring

咱們知道javac是編譯java文件的命令,編譯完的java文件就變成了.class文件,咱們能夠使用java命令運行編譯後的文件,可是實際開發中,咱們的文件有不少,並且還須要引入不少別人寫好的依賴,當不讓你用IDEA去運行,而是直接用命令你還會嗎?apache

HelloWorld

先從咱們最熟悉的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

image-20210720164848175.png

這時候咱們得帶着包去執行,因此此次咱們不在文件所在目錄執行文件,而是在包的上層目錄編譯,如上圖,個人編譯路徑應該是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也是能夠正確執行的。

那麼咱們不只依賴咱們本身的包,還依賴了別人的包,該如何編譯呢?

Maven引入依賴

<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
複製代碼

其餘命令

命令有不少,若是你不記得,快去翻翻文檔吧。

參考文檔:

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>
複製代碼

執行mvn package打包。

相關文章
相關標籤/搜索