首页 文章

将第三方jar包含在Maven阴影jar中,而不将其添加到本地存储库

提问于
浏览
30

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

Can I add jars to maven 2 build classpath without installing them?

但是,当我使用Maven Shade插件创建包含项目所有依赖项的JAR时,第三方JAR不会自动包含在内 .

如何让Maven Shade插件将这样的第三方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

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

3 回答

  • 36

    但是,当我使用Maven Shade插件创建包含项目所有依赖项的JAR时,第三方JAR不会自动包含在内 .

    是的,因为假定始终存在 system 范围的依赖关系(这正是 system 范围的内容)所以他们赢了 system 了解 system 范围依赖关系是什么,他们只是继续滥用它们(是的,这是滥用),并且然后得到副作用,并想知道为什么(正如Brian在他的answer中指出的那样) .

    我已经在SO上写了manymanyreally many次,在99%的情况下,应该避免使用 system 范围的依赖关系 . 我将再次重复Dependency Scopes迷你指南所说的内容:

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

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

    • 通过 install:install-file 将库添加到本地存储库 . 这是一种快速而肮脏的方式来使事情正常工作,如果你是一个人,它可能是一个选项,但它使你的构建不可移植 .

    • 安装并运行像Nexus,Archiva或Artifactory这样的"enterprise repository"并通过 deploy:deploy-file 添加您的库 . 这是 ideal 场景 .

    • this previous answer中所述设置基于文件的存储库并将库放在那里 . 如果您不想牺牲便携性,这就是 best 妥协 .

    请停止使用 system 范围 .

  • 1

    Maven addjars插件解决了这个问题 - 请参阅

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

  • 12

    使用<resources>将我的lib包含在所有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>
    

相关问题