由于项目中需要引入第三方jar包,但是由于是外部jar,不太适合放入公司内部maven仓库。故采用本地jar包形式引入,或者称之为第三方jar包。方法如下:
1.放入若需jar包,放在工程src目录同级就行。
2.pom.xml引入
<dependency>
<groupId>dingding</groupId>
<artifactId>dingding</artifactId>
<version>2.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/taobao-sdk-java.jar</systemPath>
</dependency>
3.打包处理
先贴出关键点。
通过system方式引入的jar,无法正常写入MANIFEST.MF文件,需要加入上述划线内容。
为了方便理解,我贴一下代码对比图
我再贴一下原始代码
<profiles>
<profile>
<id>dev</id>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>docker</id>
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/config</targetPath>
</resource>
<resource>
<directory>src/main/scripts</directory>
<targetPath>${project.build.directory}/bin</targetPath>
</resource>
<resource>
<directory>src/main/static</directory>
<targetPath>${project.build.directory}/static</targetPath>
</resource>
</resources>
<plugins>
<!-- 1、设置jar的入口类 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<!--<version>2.6</version>-->
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
<mainClass>xx.xx.XXXApplication</mainClass>
</manifest>
<manifestEntries>
<Class-Path>config/ . lib/neu-cryptography-net-1.0.0.jar lib/sun.misc.BASE64Decoder-1.0.0.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<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>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>${docker.user.name}/XXX-app:${docker.image.tag}</imageName>
<dockerDirectory>${basedir}/docker</dockerDirectory>
<pushImage>false</pushImage>
<labels>
<label>revision=${image.revision}</label>
</labels>
<buildArgs>
<appVersion>${project.version}</appVersion>
<serviceId>XXX</serviceId>
<appConfigPath>${app.config.path}</appConfigPath>
<appHome>${app.home}</appHome>
</buildArgs>
<!-- copy the service's jar file from target into the root directory of the image -->
<resources>
<resource>
<directory>${basedir}/target</directory>
<targetPath>rootfs/${app.home}</targetPath>
<include>${project.artifactId}.jar</include>
</resource>
<resource>
<directory>${basedir}/src/main/scripts</directory>
<targetPath>rootfs/${app.home}/scripts</targetPath>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<targetPath>rootfs/${app.home}/config</targetPath>
<excludes>
<exclude>src/main/resources/config/dev/*</exclude>
</excludes>
</resource>
<resource>
<directory>${basedir}/target/lib</directory>
<targetPath>rootfs/${app.home}/lib</targetPath>
</resource>
<resource>
<directory>${basedir}/src/main/static</directory>
<targetPath>rootfs/${app.home}/static</targetPath>
</resource>
</resources>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
引入时很方便,本地自测很顺利,没想到到了测试环境maven打包却踩了大坑(本地打包和测试环境打包配置不一样,测试环境是docker 容器里运行的,docker容器里的lib目录里也有对应jar,系统就是找不到)。坑了四五天才搞定,一直报 class not found。当时还搞不定就打算放到公司maven仓库算了。因为网上说的,大多数都是spring boot形式的打包,和MANIFEST.MF相关的没有说到。
我顺便贴一下我网上找的那些对我无效的,都是我踩过的坑。
1.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}/lib</outputDirectory>
<!--这里指定包含 system scope -->
<includeScope>system</includeScope>
</configuration>
</execution>
<!--打包 scope 为 compile 的 jar 包-->
<execution>
<id>copy-dependencies2</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}/lib
</outputDirectory>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
2.
3.
我这种方法的作用就是往MANIFEST.MF追加自己加入的scope为system类型的jar包路径,这样系统才能找到对应的jar包位置并引入。
附:JAR包中的MANIFEST.MF文件详解以及编写规范