强制Maven2将依赖关系复制到target / lib中

如何将我的项目的运行时依赖关系复制到target/lib文件夹中?

就像现在一样,在mvn clean installtarget文件夹只包含我的项目的jar,而不包含任何运行时依赖项。

这适用于我:

 <project> ... <profiles> <profile> <id>qa</id> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project> 

最好的方法取决于你想要做什么:

  • 如果您想要将您的依赖项捆绑到WAR或EAR文件中,那么只需将项目的打包types设置为EAR或WAR即可。 Maven会将依赖关系捆绑到正确的位置。
  • 如果要创build一个包含代码以及所有依赖项的JAR文件,请使用具有jar-with-dependencies描述符的程序集插件。 Maven将生成一个完整的JAR文件,其中包含所有的类以及来自任何依赖项的类。
  • 如果你想简单地把你的依赖关系交互地放到目标目录中,那么使用依赖插件来复制你的文件。
  • 如果你想拉入其他types的处理的依赖,那么你可能需要生成自己的插件。 有API来获取依赖关系列表,以及它们在磁盘上的位置。 你将不得不从那里拿…
 mvn install dependency:copy-dependencies 

适用于我在目标文件夹中创build的依赖关系目录。 喜欢它!

看看Maven依赖项插件 ,具体来说, 依赖:复制依赖目标 。 看看标题依赖:复制依赖mojo标题下的例子 。 将outputDirectoryconfiguration属性设置为$ {basedir} / target / lib(我相信你必须testing)。

希望这可以帮助。

对于需要将依赖关系复制到目标目录而不使用Maven的其他任何阶段(我发现在使用Vaadin时非常有用)的情况,这是一个简单而优雅的解决scheme。

完整的pom例子:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>groupId</groupId> <artifactId>artifactId</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>process-sources</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${targetdirectory}</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> 

然后运行mvn process-sources

jar文件依赖关系可以在/target/dependency

尝试这样的事情:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>MainClass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> 

如果你想偶尔做这个(因此不想改变你的POM),试试这个命令行:

  mvn依赖项:复制依赖项-DoutputDirectory = $ {project.build.directory} / lib 

如果你省略了最后一个参数 ,依赖关系被放置在target/dependencies

如果你想交付一捆你的应用程序jar,连同它的所有依赖和一些脚本来调用MainClass,看看appassembler-maven-plugin 。

下面的configuration将生成用于Window和Linux的脚本来启动应用程序(使用生成的path引用所有的依赖关系jar,将所有的依赖关系下载到目标/ appassembler下面的lib文件夹中),然后可以使用assembly插件来打包整个appassembler目录到一个压缩文件,与jar一起安装/部署到版本库。

  <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.0</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <!--declare the JSW config --> <daemons> <daemon> <id>myApp</id> <mainClass>name.seller.rich.MyMainClass</mainClass> <commandLineArguments> <commandLineArgument>start</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> <target>${project.build.directory}/appassembler</target> </configuration> </execution> <execution> <id>assemble-standalone</id> <phase>integration-test</phase> <goals> <goal>assemble</goal> </goals> <configuration> <programs> <program> <mainClass>name.seller.rich.MyMainClass</mainClass> <!-- the name of the bat/sh files to be generated --> <name>mymain</name> </program> </programs> <platforms> <platform>windows</platform> <platform>unix</platform> </platforms> <repositoryLayout>flat</repositoryLayout> <repositoryName>lib</repositoryName> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-4</version> <executions> <execution> <phase>integration-test</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/assembly/archive.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin> 

程序集描述符(在src / main / assembly中)将程序包打包为zip:

 <assembly> <id>archive</id> <formats> <format>zip</format> </formats> <fileSets> <fileSet> <directory>${project.build.directory}/appassembler</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly> 

如果你让你的项目战争或耳朵types的maven将复制依赖项。

你可以使用Shade插件来创build一个超级jar包,你可以在其中捆绑你所有的第三方依赖项。

假如

  • 你不想改变pom.xml
  • 你不想testing范围(例如junit.jar)或提供的依赖关系(例如wlfullclient.jar)

这里是什么对我有用:

 mvn安装依赖项:复制依赖关系-DincludeScope =运行时-DoutputDirectory =目标\ lib

只是简要说明已经说过的内容。 我想创build一个可执行的JAR文件,包括我的依赖和我的代码。 这对我工作:

(1)在pom的<build> <plugins>下,我包括:

 <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <archive> <manifest> <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> 

(2)运行mvn编译程序集:程序集在项目的目标目录中生成了所需的my-project-0.1-SNAPSHOT-jar-with-dependencies.jar。

(3)我用java -jar运行JAR my-project-0.1-SNAPSHOT -jar -with-dependencies.jar

这是embedded沉重的依赖关系的沉重的解决scheme,但Maven的Assembly插件为我做的伎俩。

@ Rich Seller的答案应该可以工作,但是对于更简单的情况,您只需要使用指南中的摘录:

 <project> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> </project> 

如果您在Eclipse中的Tomcat服务器上运行时遇到与不在WEB-INF / lib文件中相关的依赖关系问题,请查看以下内容:

启动Tomcat时发现ClassNotFoundException DispatcherServlet(Maven依赖关系未复制到wtpwebapps)

您只需在Project Properties> Deployment Assembly中添加Maven Dependencies。