我正在使用maven-assembly插件来创建我的应用程序的jar,包括它的依赖项如下:
<assembly>
<id>macosx</id>
<formats>
<format>tar.gz</format>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
(我省略了一些与问题无关的其他内容)
到目前为止,这个工作正常,因为它创建了一个包含所有依赖项的lib
目录。但是,我最近添加了一个新的依赖项,其范围为system
,并且它不会将其复制到lib
输出目录。我必须在这里遗漏一些基本的东西,所以我请求帮助。
我刚刚添加的依赖项是:
<dependency>
<groupId>sourceforge.jchart2d</groupId>
<artifactId>jchart2d</artifactId>
<version>3.1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>
我能够包含此依赖项的唯一方法是将以下内容添加到assembly元素:
<files>
<file>
<source>external/jchart2d-3.1.0.jar</source>
<outputDirectory>lib</outputDirectory>
</file>
</files>
但是,这会强制我在重命名此jar时更改pom和程序集文件(如果有的话)。而且,这似乎是错的。
我在<scope>runtime</scope>
和dependencySets
中尝试使用<include>sourceforge.jchart2d:jchart2d</include>
而没有运气。
那么如何在maven 2中的汇编文件中包含system
范围的jar?
非常感谢
答案 0 :(得分:78)
我并不感到惊讶,因为没有添加系统范围依赖关系(毕竟,必须根据定义明确提供系统范围的依赖关系)。实际上,如果您真的不想将该依赖项放在本地存储库中(例如,因为您希望将其作为项目的一部分进行分发),那么我就会这样做:
我会在我的pom.xml
中声明存储库,如下所示:
<repositories>
<repository>
<id>my</id>
<url>file://${basedir}/my-repo</url>
</repository>
</repositories>
我只是声明没有system
范围的工件,这只是麻烦的来源:
<dependency>
<groupId>sourceforge.jchart2d</groupId>
<artifactId>jchart2d</artifactId>
<version>3.1.0</version>
</dependency>
我不是100%确定这会满足您的需求,但我认为这是比使用系统范围更好的解决方案。
更新:我应该在原来的答案中提到我现在正在修理它。要在基于文件的存储库中安装第三方库,请使用带有localRepositoryPath
参数的install:install-file
:
mvn install:install-file -Dfile=<path-to-file> \
-DgroupId=<myGroup> \
-DartifactId=<myArtifactId> \
-Dversion=<myVersion> \
-Dpackaging=<myPackaging> \
-DlocalRepositoryPath=<path-to-my-repo>
您可以将其粘贴到* nix shell中。在Windows上,删除“\
”并将所有内容放在一行上。
答案 1 :(得分:22)
顺便说一句,你可以自动化它并使它成为你的maven构建的一部分。以下内容将在编译之前将jar安装到本地存储库中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>validate</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
答案 2 :(得分:15)
如果您创建jar
,我会找到简单的解决方案<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>dependencies/mydep</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>true</filtering>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
答案 3 :(得分:4)
您还可以通过在dependencySets中添加补充dependencySet来处理此问题。
<dependencySet>
<scope>system</scope>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
最好的方法是使用Repository Manager(如Nexus,Artifactory,Archiva)并在特定的存储库中安装此类依赖项。之后,您可以使用简单依赖项之类的东西。这将简化你的生活。
文档:https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
答案 4 :(得分:2)
编辑:很抱歉,我没有意识到alx也提到了清洁生命周期的解决方法。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
根据alx提供的解决方案,您可以在清洁阶段执行安装文件步骤。但由于清洁阶段不在默认生命周期中,因此您必须在第一次执行mvn clean
以确保jar在本地仓库中准备就绪。
ex: mvn clean; mvn包
答案 5 :(得分:2)
一个简单的解决方案是将其添加到本地maven存储库
一种方法是通过上一篇文章中建议的mvn install命令。
另一个简单的方法是, 1)在你的eclipse中右键单击项目选择Maven选项。 2)选择“安装或将工件部署到maven存储库”选项,然后单击“下一步”。 3)点击Artifact文件旁边的浏览复选框&amp;选择你的jar文件 4)输入GroupId和ArtifactId,版本确保生成pom&amp;检查创建校验和&amp;包装是罐子
点击完成,Wallah!你的工作已经完成,jar被添加到你的本地存储库中,你可以在settings.xml或m2目录中定义
现在只需根据GroupId,ArtifactId&amp;添加简单的maven依赖项。您根据导入输入的jar版本,以及您的外部jar将由maven打包。
答案 6 :(得分:1)
它在我的解决方案上更容易实现:
从您的依赖项中删除:
<dependency>
<groupId>tiago.medici</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1</version>
</dependency>
然后在pom.xml中添加maven-install-plugin。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/external/tiago.medici-0.0.1.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>tiago.medici</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>