繁体   English   中英

将第 3 方 jar 包含在 Maven 着色 jar 中,而不将其添加到本地存储库

[英]Having a 3rd party jar included in Maven shaded jar without adding it to local repository

我已经在 Stack Overflow 上找到了如何在项目中包含第 3 方 JAR 而不将其安装到“本地存储库”的答案:

我可以将 jars 添加到 maven 2 构建类路径而不安装它们吗?

但是,当我使用 Maven Shade Plugin 创建一个包含项目所有依赖项的 JAR 时,不会自动包含第 3 方 JAR。

我怎样才能让 Maven Shade Plugin 将这样的 3rd 方 JAR 添加到阴影 JAR 中?


根据得到的答案,我让它工作了。 我所做的是,将这个片段添加到我的 pom.xml 的开头:

<repositories>
  <repository>
    <id>repo</id>
    <url>file://${basedir}/repo</url>
  </repository>
</repositories>

然后为我的项目添加了一个依赖项,也添加到 pom.xml:

<dependencies>
  <dependency>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>0.0.0</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

然后运行命令行将包添加到“repo”:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file
    -Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy
    -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/

(不确定 repo 路径是否需要是完整路径,但不想冒险。)

repo 子目录的内容现在是:

repo/dummy/dummy/0.0.0/dummy-0.0.0.jar
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom
repo/dummy/dummy/maven-metadata-local.xml

现在我可以将其签入版本控制,并且没有本地或远程依赖项。

但是,当我使用 Maven Shade Plugin 创建一个包含项目所有依赖项的 JAR 时,不会自动包含第 3 方 JAR。

是的,因为假定system范围的依赖项始终存在(这正是system范围的内容),所以它们不会被包含在内。 人们实际上不明白system范围依赖是什么,他们只是继续滥用它们(是的,这是滥用),然后得到副作用并想知道为什么(正如布莱恩在他的回答中指出的那样)。

我已经写很多很多真的很多次关于这个在这里SO和在99%的情况, system范围的依赖性应该避免。 我将再重复一遍Dependency Scopes迷你指南所说的内容:

  • system :在项目生命周期的某个阶段需要此依赖项,但它是特定于系统的。 不鼓励使用此范围:这被认为是一种“高级”功能,只有在您真正了解其使用的所有后果时才应使用,如果实际上无法量化,这可能非常困难。 根据定义,此范围使您的构建不可移植。 在某些边缘情况下可能有必要。 系统范围包括<systemPath>元素,该元素指向本地机器上此依赖项的物理位置。 因此,它用于指代某些预期存在于给定本地机器上而不是存储库中的工件; 并且其路径可能因机器而异。 systemPath 元素可以在其路径中引用环境变量:例如${JAVA_HOME}

因此,不是使用system范围,而是:

  • 通过install:install-file将您的库添加到本地存储库。 这是一种快速而肮脏的工作方式,如果您独自一人,这可能是一种选择,但它会使您的构建不可移植。
  • 安装并运行“企业存储库”,例如 Nexus、Archiva 或 Artifactory,并通过deploy:deploy-file添加您的库。 这是理想的场景。
  • 如上一个答案中所述设置基于文件的存储库,并将您的库放在那里。 如果您没有公司存储库但需要作为一个团队工作并且不想牺牲可移植性,那么这是最好的折衷方案。

请停止使用system范围。

Maven addjars 插件解决了这个问题——见

http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage

使用 <resources> 将我的库包含在所有 jar 中。 即:

<build>
    <resources>
        <resource>
            <directory>${project.basedir}</directory>
            <includes>
                <include>lib/*.jar</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

如果您只需要一个快速而肮脏的解决方案,您可以将提取的 jar 文件的内容添加到您的 src/main/resource 目录中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM