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

Yup*_*ing 59 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>
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,这工作得很好,因为它创建了一个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>
Run Code Online (Sandbox Code Playgroud)

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

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>
Run Code Online (Sandbox Code Playgroud)

但是,这会强制我在重命名此jar时更改pom和程序集文件(如果有的话).而且,这似乎是错的.

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

那么如何system在maven 2中将scoped jar 包含到汇编文件中?

非常感谢

Pas*_*ent 81

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

  • 我会将依赖项放在项目本地的"文件系统存储库"中.
  • 我会在我pom.xml这样声明存储库:

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
    Run Code Online (Sandbox Code Playgroud)
  • 我只是声明没有system范围的工件,这只是麻烦的来源:

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    
    Run Code Online (Sandbox Code Playgroud)

我不是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>
Run Code Online (Sandbox Code Playgroud)

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

  • 它确实有效,但将文件安装到与 $HOME/.m2/repository 不同的本地存储库中并不是一项简单的任务。我必须执行 mvn install:install-file [...install-file options...] -Dmaven.repo.local=path_to_my_local_repo 这迫使 maven 下载其最基本的插件。您能建议如何将文件安装到这个本地存储库吗? (2认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不起作用.我也提到了这个解决方案,认为这似乎是最简单的,但Maven要求解决所有依赖关系_before_执行绑定到`validate`阶段的插件(在`compile`之前,等等......).因此,一旦安装了工件,这将重新安装它,但它不会进行初始安装 - 这是鸡/蛋问题.一个_could_将它绑定到`clean`阶段(因为它不需要首先进行依赖关系解析)并告诉开发人员首先运行`mvn clean`,但是它不再使用开箱即用的"标准过程". (6认同)
  • 它不支持一次安装多个文件吗? (2认同)
  • 绑定到 `initialize` 对我有用。我的 IDE 抱怨未解决的依赖关系,但是当我运行它时,每次都会安装本地 JAR 文件,然后解决得很好。出色的解决方案@alx! (2认同)

mc.*_*dev 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>
Run Code Online (Sandbox Code Playgroud)

  • 这更简单...为什么要添加到本地回购等? (3认同)

khm*_*ise 5

您也可以通过在您的dependencySet中添加补充的dependencySet来处理此问题。

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>
Run Code Online (Sandbox Code Playgroud)

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

文件:https//maven.apache.org/plugins/maven-assembly-plugin/assembly.html