具有依赖关系的Maven 2程序集:不包括范围“系统”下的jar

时间:2010-01-14 17:01:44

标签: maven-2 maven-plugin maven-assembly-plugin

我正在使用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?

非常感谢

7 个答案:

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