离开了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打包。

相关文章
相关标签/搜索