Java+Maven工程打包

Java+Maven工程打包

Java环境变量

  • JAVA_HOME:作用是一些基于java开发的工具会用到,比如tomcat,groovy,vertx…,如果不用这个工具这个变量也可以免了。不过通常为了方便以后用java开发的小工具,一般都会设置JAVA_HOME,然后把$JAVA_HOME/bin追加到PATH中
  • PATH:为了命令行敲起来方便,所以通常会把jdk/bin目录下加入到path变量中
  • CLASSPATH:重点解释一下这个配置,jdk6以前需要配置这个变量,值为jdk\jre\lib\rt.jar,这是jdk的基础类库,jdk6以后的版本都不用再配CLASSPATH

CLASSPATH变量的值可以设置为多个jar包或者目录,主要作用在package和import关键字,例如import java.util.Date这行代码会在CLASSPATH设置的jar包或者目录中寻找,如果没找到,则报ClassNotFoundException异常

注意:在Windows环境下PATH和CLASSPATH配置值多个用英文分号分割,Linux环境下用英文冒号分割

Maven工程

在这里插入图片描述

如上图所示,是一个简单的maven工程的目录结构,其中java(main),resources,java(test)是maven默认设置的CLASSPATH目录

如果需要增加一个资源目录,例如增加scala目录,点击IDEA中File --> Project Structure (快捷键Ctrl+Shift+Alt+S)

在这里插入图片描述

建议不要增加其他source目录,一般情况下maven插件

maven-jar-plugin打包src/main/java下的java和scala类,src/main/resources下所有目录文件

maven-scala-plugin打包src/main/scala下的scala类,src/main/resources下所有目录文件

而其他新增资源目录打包配置比较麻烦

打包插件配置如下

<plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.2</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib</classpathPrefix>
            </manifest>
            <manifestEntries>
                <!-- 注意:这里不要换行,必须一行写完 -->
                <Class-Path>./</Class-Path>
            </manifestEntries>
        </archive>
        <!-- 过滤掉不希望出现在jar里面的 -->
        <excludes>
            <exclude>conf/**</exclude>
        </excludes>
    </configuration>
</plugin>

关于配置文件

一般情况下,配置文件或者其他资源文件放在src/main/resources目录下

在java中,读取配置文件有两种方式:

  • new File(“config file”):此时如果使用相对路径需要加上src/main/resources,不同模块相对路径不同很麻烦;如果使用绝对路径在Linxu环境又需要修改

  • Thread.currentThread().getContextClassLoader().getResource(“config file”):这是路径是src/main/resources下的相对路径,推荐使用这种方式

使用ClassLoader加载配置文件有一个问题:默认情况下,由于src/main/resources下的文件是打包在jar中的,所有读取正常。但是事实上我们希望配置文件是在jar外面,方便随时修改配置,此时ClassLoader便读不到配置文件。解决办法在于配置CLASSPATH变量。

解决方法1

此时jar包和配置文件在同级目录,将jar包的父目录路径赋给CLASSPATH变量,在环境变量中写死。不推荐使用这种方式。

解决方法2

在执行java程序的脚本中添加参数,如:java -cp ${resources}:xxx.jar,其中resources是资源路径,xxx.jar是可执行程序包。(推荐)

关于依赖包引用

IDEA开发时有两种方式引用依赖jar包

  • IDEA配置:点击IDEA中File --> Project Structure (快捷键Ctrl+Shift+Alt+S)

在这里插入图片描述

点击添加JARs or directories,选择本地的jar包即可

注意:这种方式加入依赖包有一个坑,使用maven打包时不能加入这些依赖包,最后导致本地运行正常,部署时ClassNotFoundException异常。

  • Maven配置:推荐使用Maven Pom的方式引用依赖包,如果仓库中找不到需要的jar包,可以使用下面的方式或者上传jar包到公司的私服
<scope>system</scope>
<systemPath>jar包路径</systemPath>

部署时依赖包引用问题

一般情况下,在Linux环境执行程序时,都是执行一个可执行的jar包,这里有3中情况

  • 1.打包时将程序和所有依赖包打包成一个jar包,然后通过java命令执行这个jar。

不推荐使用这种方式,因为jar包可能会很大,在调试时上传到服务器中会比较耗时间

  • 2.将程序jar包和依赖包分开,使用maven的方式添加依赖

上述打包插件maven-jar-plugin中manifest配置表示,将依赖包放入lib目录下,在打包的程序jar中会有META-INF\MANIFEST.MF

在这里插入图片描述

这个文件通过maven的方式设置CLASSPATH,此时通过java命令启动程序jar包即可

  • 3.将程序jar包和依赖包分开,在shell脚本中添加CLASSPATH

注意CLASSPATH变量值不能使用*号作为通配符,在启动脚本中使用for循环方式添加所有的jar和资源目录并赋值给CLASSPATH变量,然后通过java启动

如果shell脚本不熟练的话可以使用第二种方式,否则推荐使用第三种方式,这种方式比较灵活。


版权声明:本文为yezi1238原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。