<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          離開了IDEA,你還會(huì)運(yùn)行JAVA項(xiàng)目嗎?

          共 10680字,需瀏覽 22分鐘

           ·

          2021-07-26 15:18

          來(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ò)了,找不到主類。

          image-20210720164848175.png

          這時(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 -


          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色电影网站在线免费观看 | www.17c亚洲蜜桃 | 免费AV黄色 | 无码人妻一区二区蜜桃 | 国产无遮挡又黄又爽在线观看 |