首页 文章

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

提问于
浏览
54

我正在使用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和程序集文件(如果有的话) . 而且,这似乎是错的 .

我在 dependencySets<include>sourceforge.jchart2d:jchart2d</include> 尝试了 <scope>runtime</scope> 没有运气 .

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

非常感谢

7 回答

  • 74

    它在我的解决方案上以更简单的方式工作:

    从您的依赖项中删除:

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

    我并不感到惊讶,因为没有添加系统范围依赖关系(毕竟,必须根据定义明确提供系统范围的依赖关系) . 实际上,如果您真的不想将该依赖项放在本地存储库中(例如,因为您希望将其作为项目的一部分进行分发),那么我会这样做:

    • 我会将依赖项放在项目的"file system repository" local中 .

    • 我会在 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%确定这将满足您的需求,但我认为这是比使用系统范围更好的解决方案 .

    Update: 我应该在原来的答案中提到我现在正在修理它 . 要在基于文件的存储库中安装第三方库,请将 install:install-filelocalRepositoryPath参数一起使用:

    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

    顺便说一句,你可以自动化它,并使其成为你的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>
    
  • 21

    如果你创建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>
    
  • 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

  • 2

    一个简单的解决方案是将其添加到本地maven存储库中

    一种方法是通过上一篇文章中建议的mvn install命令 .

    另一个简单的方法是,1)在你的eclipse中右键单击项目选择Maven选项 . 2)选择“安装或将工件部署到maven存储库”选项,然后单击“下一步” . 3)单击Artifact文件复选框旁边的浏览并选择你的jar文件4)输入GroupId和ArtifactId并确保版本确保生成pom和create校验和,并且打包是jar

    点击完成,Wallah!你的工作已经完成,jar被添加到你的本地存储库中,你可以在settings.xml或m2目录中定义

    现在只需按照导入输入的GroupId,ArtifactId和jar版本添加简单的maven依赖项,即外部jar将由maven打包 .

  • 1

    编辑:对不起,我没有意识到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在本地仓库中准备就绪 .

    例如:mvn clean; mvn包

相关问题