mvn-打包依赖-copy-dependency
slug: /mvn-copy-dependency title: mvn 打包依赖 tags: [mvn, java]
date: "2023-07-28"
mvn 打包依赖
copy-dependencies 只打包了第一层依赖
执行子模块打包后
mvn -U clean package -pl demo-task -am -DskipTests=true, lib文件里总是只包含第一层pom文件的依赖, 并没有包含所有完整的依赖, 导致程序部署运行后出现ClassNotFound的错误, 但编译的时候却一切正常. 后来才发现原来复制依赖jar包的时候有特殊配置.
maven-dependency-plugin插件里, copy-dependencies可以用来复制打包时候的依赖, 不过有不少特殊参数.
如果设置<excludeTransitive>false</excludeTransitive>参数如果配置为true,那么打包依赖的时候只会复制pom里的第一层依赖, 并不会复制关联的第二层依赖. 第二层依赖也叫做transitive dependencies.
- copy-dependencies
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeTransitive>false</excludeTransitive><!-- true 则不加载 继承jar -->
</configuration>
</execution>
</executions>
</plugin>
- 可以参考的完整打包的pom文件build依赖配置
<build>
<finalName>demo-task</finalName>
<plugins>
<!-- 编译:使用 maven-compiler-plugin 插件, 支持设定JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<showWarnings>true</showWarnings>
<encoding>UTF-8</encoding>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeTransitive>false</excludeTransitive><!-- true 则不加载 继承jar -->
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- Jar file entry point -->
<mainClass>com.demo.Runner</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
参考
copy dependencies transitive and not transitive
https://stackoverflow.com/questions/11973889/copy-dependencies-transitive-and-not-transitive