Maven 2程序集与依赖关系:范围内的“系统”jar不包括在内

我正在使用maven-assembly插件来创build我的应用程序的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> 

(我省略了一些与问题无关的其他内容)

到目前为止,这工作正常,因为它创build一个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> 

我能够包括这种依赖的唯一方法是将以下内容添加到汇编元素:

 <files> <file> <source>external/jchart2d-3.1.0.jar</source> <outputDirectory>lib</outputDirectory> </file> </files> 

但是,这迫使我改变POM和程序集文件,每当这个jar子被重命名,如果有的话。 另外,这似乎是错的。

我已经试过在dependencySets<include>sourceforge.jchart2d:jchart2d</include>使用<scope>runtime</scope> ,但没有运气。

那么如何在maven 2中将一个system范围的jar包含到你的程序集文件?

非常感谢

我并不惊讶系统范围依赖不会被添加(毕竟,系统范围的依赖必须由定义明确提供)。 实际上,如果你真的不想把这个依赖关系放到你的本地仓库中(例如,因为你想把它作为你的项目的一部分来分发),那么我会这样做:

  • 我会把依赖关系放在项目本地的“文件系统库”中。
  • 我会在我的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%确定这将适合您的需求,但我认为这是比使用系统范围更好的解决scheme。

更新:我应该提到,在我原来的答案,我现在正在修复它。 要在基于文件的存储库中安装第三方库,请使用带有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中。 在窗口上,删除“ \ ”并把所有内容放在一行上。

顺便说一句,你可以自动化,并使其成为你的maven构build的一部分。 以下将在编译之前将您的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> 

我发现容易的解决scheme,如果你创buildjar

 <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> 

你也可以通过在你的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

一个简单的解决scheme是将其添加到本地的Maven仓库

一种方法是通过mvn安装命令,如上一篇文章中的build议。

另一个简单的方法是,1)在你的Eclipse IDE中右击项目selectMaven选项。 2)select安装或部署工件到一个Maven仓库选项,然后点击下一步。 3)点击工件文件旁边的浏览checkbox,并select你的jar文件4)inputGroupId和ArtifactId和版本确保生成POM&创build校验和检查和包装是jar子

点击完成,沃拉! 你的工作已经完成了,jar被添加到你可以在setting.xml或者m2目录中定义的本地仓库中

现在只需按照您input的GroupId,ArtifactId和jar版本添加简单的maven依赖项,这就是您的外部jar将被maven打包。

编辑:对不起,我没有意识到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提供的解决scheme,您可以在清理阶段执行安装文件步骤。 但由于清理阶段不在默认的生命周期中,所以您必须在第一次执行mvn clean以确保jar已经准备好在本地回购了。

例如: mvn clean; mvn包