java打包时打入本地依赖包
在某些情况下,需要进行本地依赖包引入.但如果配置不当很容易出现NoClassDefFoundError的报错.
目前正好进行sdk开发,因此整理打包时加入本地依赖包的方案与过程.
方案1:将所有依赖写入jar包
在某些情况下(如内网环境),第三方依赖包并不一定能够使用maven进行下载(如果没有Nexus服务器),且需要生成一个可单独使用的jar包(如sdk开发)
因此可以将所有的依赖都写入jar包中
下边是步骤:
(1)pom文件中导入本地包
<dependency>
<!-- groupId artifactId version内容随意写 -->>
<groupId>livillya.von.einzbern</groupId>
<artifactId>livillya.von.einzbern</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/你的jar包名.jar</systemPath>
</dependency>
此时,如果是单纯跑项目,已经是可以使用
(2)编写pom.xml的build参数
<build>
<plugins>
<!-- 用于管理版本,某些项目是没有parent引用的-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 使用maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptors>
<!--assembly配置文件路径,注意需要在项目中新建文件assembly/package.xml-->
<!-- ><descriptor>${basedir}/assembly/package.xml</descriptor> -->
<descriptor>src/main/resource/package.xml</descriptor>
</descriptors>
</configuration>
<!-- executions配置 -->
<executions>
<execution>
<id>make-assembly</id>
<!-- 绑定到package生命周期 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果不进行 executions配置,则需要自己执行 mvn package assembly:single
以下为package.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>package</id>
<formats>
<format>jar</format>
<!-- 如果写多个format,可打出多种包
<format>zip</format>
<format>tar.bz2</format>-->
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>system</scope>
</dependencySet>
</dependencySets>
</assembly>
此时,进行打包操作后,可多得到一个 你的项目打包名-package.jar 的jar包,该包包含所有依赖文件
方案2:打包时在MANIFEST.MF文件中写入jar包依赖
大部分项目并不需要把jar文件单独使用,可以打成一个jar和lib分开的包
在MANIFEST.MF的Class-Path中加入jar包的路径即可
以下为我常用的build配置
<build>
<finalName>你的项目名</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<outputDirectory>
${project.basedir}/src/main/resources/lib/
</outputDirectory>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<mainClass>com.main.你的程序入口</mainClass>
<!-- 打包时 MANIFEST.MF文件不记录时间戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<!-- 假设你的jar包放在resources/lib中 -->
<Class-Path>../config/ ./config/ . lib/你的jar包名.jar</Class-Path>
</manifestEntries>
</archive>
<excludes>
<!--编译结果目录开始算目录结构 -->
<exclude>lib/*</exclude>
<exclude>config/**</exclude>
<exclude>bin/**</exclude>
<exclude>*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>