64

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

我能够包含此依赖项的唯一方法是将以下内容添加到程序集元素中:

<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>运气。

那么如何system在 maven 2 中将作用域 jar 包含到您的程序集文件中呢?

非常感谢

4

7 回答 7

90

没有添加系统范围依赖项我并不感到惊讶(毕竟,具有系统范围的依赖项必须由定义显式提供)。实际上,如果您真的不想将该依赖项放在本地存储库中(例如,因为您想将其作为项目的一部分分发),我会这样做:

  • 我会将依赖项放在项目本地的“文件系统存储库”中。
  • 我会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% 确定这会满足您的需求,但我认为这是一个比使用系统范围更好的解决方案。

更新:我应该在我的原始答案中提到这一点,我现在正在修复它。要在基于文件的存储库中安装第三方库,请使用install:install-file以下localRepositoryPath参数:

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

您可以将其粘贴到 *nix shell 中。在 Windows 上,删除“ \”并将所有内容放在一行上。

于 2010-01-14T22:43:52.220 回答
25

顺便说一句,您可以将其自动化并使其成为您的 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>
于 2010-04-10T09:45:47.903 回答
16

如果您创建 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>
于 2011-11-03T06:12:08.950 回答
5

您还可以通过在您的依赖集中添加补充依赖集来处理此问题。

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

最好的办法是使用存储库管理器(如 Nexus、Artifactory、Archiva)并在特定存储库中安装这种依赖项。之后,您可以使用诸如简单依赖项之类的东西。这将简化您的生活。

文档

于 2011-11-03T06:41:43.363 回答
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提供的解决方案,可以在clean阶段执行install file步骤。但由于 clean 阶段不在默认生命周期中,因此您必须mvn clean在第一时间执行以确保 jar 在本地 repo 中已准备好。

例如:MVN 清洁;mvn包

于 2014-06-05T08:26:49.867 回答
2

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

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

另一种简单的方法是,1)在您的 Eclipse IDE 中右键单击项目选择 Maven 选项。2) 选择安装或将工件部署到 Maven 存储库选项,然后单击下一步。3)单击工件文件复选框旁边的浏览并选择您的 jar 文件 4)输入 GroupId 和 ArtifactId 和版本确保检查生成 pom 和创建校验和并打包为 jar

点击完成,就是这样!您的工作已完成,jar 已添加到您可以在 setting.xml 或 m2 目录中定义的本地存储库中

现在只需根据您根据导入输入的 GroupId、ArtifactId 和 jar 版本添加简单的 maven 依赖项,这就是您的外部 jar 将由 maven 打包。

于 2015-10-26T14:42:12.700 回答
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>
于 2018-03-15T14:01:10.220 回答