【问题标题】:Looking for a Maven shortcut -- including a jar file in a Maven build寻找 Maven 快捷方式——包括 Maven 构建中的 jar 文件
【发布时间】:2011-10-27 17:10:28
【问题描述】:

我继承了一个 Maven 项目。我只是将它用作构建工具,我想尽可能少地打扰。我必须对其中一个 Java 文件稍加添加,并且该添加要求我在构建路径中包含一个新 jar。 How do I say:这里有一个罐子,随便用。它不必被版本控制或依赖或下载或任何东西,只需使用它。任何帮助将不胜感激。

编辑:我找到了this,它确实有效(!)。如果知道此类事情的人可以阅读此答案并且它似乎相当正确,请将此问题作为一个副本关闭。

编辑:不,我误解了我的结果。它似乎没有工作。

【问题讨论】:

  • 它可能有效,但这不是 maven 中的干净方法,因为它需要摆弄 jars。我不推荐这个。

标签: java maven-2


【解决方案1】:

到目前为止,使用 maven 管理依赖项的最佳方法是从存储库中获取它们,但我会想到总共四个选项,按照从最理想到最不理想的顺序排列:

  1. 如果 jar 是常见的第三方库,您几乎肯定会在某个存储库中找到它。您只需添加一个 <dependency> 元素,还可能添加一个 <repository>,这样它就知道从哪里获取依赖项。
  2. 应将在任何 repo 中不可用的本地 jar 部署到本地存储库,例如 Nexus,您的整个团队/公司都可以使用它。然后像选项1一样将依赖添加到您的项目中。这样它只需要处理一次,其他人都可以通过正常的Maven机制获取jar。
  3. 要仅在本地处理问题并且不提供工件的任何可重用性,您可以使用 install:install-file 目标将其安装到本地存储库(即 ~/.m2/repository 中的本地缓存)中。
  4. 最后,最不希望的是,您可以使用system-scoped dependency。这意味着您在文件系统中的某处有可用的 jar 文件,将 <dependency><scope> 元素设置为值“system”,并添加一个包含相关 jar 完整路径的 <systemPath> 元素。

编辑:由于选项 4 似乎适合您,只需将 jar 放入您的项目并将其提交给您的版本控制。然后,假设 jar 位于项目中的 lib/foo.jar 中,将其添加到 POM 的依赖项中:

<dependency>
    <groupId>some-group</groupId>
    <artifactId>some-artifact</artifactId>
    <version>1.2.3.4</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/foo.jar</systemPath>
</dependency>

这都是凭记忆,但听起来不错。

【讨论】:

  • 这是一个专有的 jar,我是我团队/公司中唯一的人。 intall:intall-file 是我的第一个想法,但我无法让它工作(得到一个非常模糊的错误消息)。我喜欢@JVerstry 的解决方案的原因是我可以全部检查,所以如果我的机器出现 kerboey,我可以很容易地重建。
  • 实际上,他的解决方案与我的选项 4 相比还有很长的路要走。它在大约 1/10 的 XML 行中完成了他的配置。只需检查 jar 和 POM 更改,您就在完全相同的地方,没有所有的混乱。
  • 在我的回答中添加了一个例子。
  • 嗯,这似乎行得通。 7 对 48 行 XML。我想有一个理由不喝 Kool-Aid。或者至少不要完成整个投手......
  • 大声笑+1。我喜欢 Maven,但有时它会变得有点疯狂。
【解决方案2】:

以下是一些相关的答案: Maven: keeping dependent jars in project version control

我不建议使用 POM 中的 install:install-file - 如果这是一次性要求,您最好从命令行使用它并将其记录为准备步骤。但是,使构建自包含或提供包含所需工件的存储库肯定是更好的选择。

【讨论】:

    【解决方案3】:

    这里是如何继续。受pom.xml 启发,创建一个单独的 maven 项目。

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
        <groupId>net.dwst</groupId>
        <artifactId>MavenMissingJars</artifactId>
        <version>1.0</version>
        <packaging>jar</packaging>
    
        <name>Maven Missing Jars</name>
    
        <build>
    
            <plugins>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <execution>
                            <id>dProguard-4.6</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>install-file</goal>
                            </goals>
                            <inherited>false</inherited>
                            <configuration>
                                <file>toinstall/4.6/proguard.jar</file>
                                <groupId>net.sf.proguard</groupId>
                                <artifactId>proguard</artifactId>
                                <version>4.6</version>
                                <packaging>jar</packaging>
                                <generatePom>true</generatePom>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
            </plugins>
    
        </build>
    
    </project>
    

    假设有一个相对于您的pom.xml/toinstall/4.6/ 目录,并且其中有一个名为proguard.jar 的jar,调用此插件会将jar 从您的本地目录复制到您的maven 本地存储库。

    这必须执行一次,这就是为什么最好有一个单独的小型 maven 项目来注入丢失的 jar。

    然后,使用您在上述pom.xml 中定义的坐标(artifactid、版本和打包)在您的项目中添加一个依赖项。

    【讨论】:

    • 天哪。有人请告诉我这是不对的。我真的不需要这个怪物,不是吗? (没有批评你,JVerstry,我很感激你的帮助,但我不敢相信这真的是在 Maven 中“尽可能少地干扰事情”。
    • @Malvolio 哈哈,是的,你需要那个“怪物”。如果你有几个jar要添加,那么你可以在上面的例子中多次调用插件来安装很多jar。只需在 pom.xml 中多次复制插件并修改配置即可。
    • 在 80 年代,我在 IBM 环境中工作(非常短暂)。每个操作(如打印或编译文件)都是通过生成一个冗长的 JCL 文件来描述您想要完成的操作并提交它来完成的。有点让我想起了。
    • @Malvolio 很高兴它成功了。一开始我不喜欢 Maven 的冗长,但现在我不在乎了。 Maven 是一个很棒的工具。一旦正确配置,它就可以完成工作。
    • 这就是所谓的“喝Kool-Aid”。
    猜你喜欢
    • 2013-01-31
    • 2010-10-10
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多