从现有 jar 创建 maven 工件的最佳方法

Posted

技术标签:

【中文标题】从现有 jar 创建 maven 工件的最佳方法【英文标题】:Best way to create a maven artifact from existing jar 【发布时间】:2011-01-11 17:37:40 【问题描述】:

我正在做一些项目。

这些项目都依赖于许多库,其中大部分都可以在 maven repo 中找到。 对于其他库,我想创建一个 Maven 工件,所以我可以将它用作依赖项。问题是,我只有这些库的 jar 文件。

从现有 jar 文件创建工件的最佳方法是什么?

【问题讨论】:

Add a dependency in Maven的可能重复 我正在寻找同样的东西,并假设您想要发布到 Nexus/Codeartifact 或其他存储库,您可以使用 AWS 文档关于该主题。它解释了如何使用mvn 在没有 POM 文件的情况下部署单个 Jar。 docs.aws.amazon.com/codeartifact/latest/ug/… 【参考方案1】:

如果您不使用 remote 存储库(这是个人开发的常见情况),只需 install 这些工件在您的本地 使用install:install-file mojo 的存储库:

mvn install:install-file 
  -Dfile=<path-to-file> 
  -DgroupId=<group-id> 
  -DartifactId=<artifact-id> 
  -Dversion=<version> 
  -Dpackaging=<packaging> 
  -DgeneratePom=true

Where: <path-to-file>  the path to the file to load
       <group-id>      the group that the file should be registered under
       <artifact-id>   the artifact name for the file
       <version>       the version of the file
       <packaging>     the packaging of the file e.g. jar

但显然,这会使您的构建不可移植(尽管这可能不是问题)。为了不牺牲可移植性,您必须使工件在远程存储库中可用。在企业环境中,处理该问题的常用方法是安装企业存储库(在这种情况下,确实是到deploy 工件)。

更新:将工件安装到本地存储库后,只需在 pom 中声明一个 &lt;dependency&gt; 元素,就像任何其他依赖项一样,例如:

<dependency>
  <groupId>aGroupId</groupId>
  <artifactId>aArtifactId</artifactId>
  <version>1.0.12a</version>
  <packaging>jar</packaging>
</dependency>

【讨论】:

与上述相同的问题,安装文件是否解决了依赖关系?还是仅将 jar 文件上传到本地存储库?如果是第二种情况,您将如何在 pom.xml 中创建依赖项? @Nils 不, install:install-file 不会解决依赖关系。这怎么可能发生?如果它们没有“mavenized”,Maven 对这些工件及其依赖关系一无所知。所以,确实,它只会上传指定的jar文件。我将更新我的答案,向您展示如何在 pom.xml 中声明依赖关系。 好吧,这是我的猜测。正如 manuel 所描述的,以手动方式处理传递依赖是很痛苦的。所以我的想法(我认为这以某种方式反映了 3wh 问题)是如何处理 jar 时的依赖关系。我记得我以前的一位同事编写了一些脚本来查看 jar、它的源/类文件和 lib 文件夹,并尝试使用这些信息创建一个具有尽可能好的依赖关系的 pom。但看起来,这个东西从来没有进入 maven 插件存储库。或者有没有类似的?【参考方案2】:

您可以使用Maven Deploy Plugin 将您的 JAR 文件(以及可选的 POM 文件,尽管默认情况下会为您创建一个)上传到您的 Maven 存储库。

【讨论】:

【参考方案3】:

作为danben said,您必须将这些jar 部署到存储库。但是,我似乎从您的问题中了解到,除了全局 maven 之外,您没有存储库。

您可以使用Nexus 或Artifactory。

【讨论】:

【参考方案4】:

我知道你的问题。 Mavenizing jars 有时会很痛苦(特别是如果它们有进一步的传递依赖,也需要在 pom.xml 中定义)。

您是否检查过这些库是否真的从未作为 maven deps 存在?看看常见的嫌疑人:

http://www.ibiblio.org/maven/ http://repository.codehaus.org/ http://download.java.net/maven/1/

有时我喜欢使用 Nexus jar 上传对话框来创建 pom.xml 文件。

【讨论】:

不要手动查看,使用搜索引擎:maven.apache.org/general.html#How_to_find_dependencies 你是对的。这是第一步。仍然(尽管非常罕见)我有时不得不手动搜索,因为搜索引擎找不到依赖项。【参考方案5】:

您还可以在项目中的存储库中没有的 jar 上创建“系统”依赖项。例如,

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>MySpecialLib</artifactId>
        <version>1.2</version>
        <scope>system</scope>
        <systemPath>$basedir/src/main/webapp/WEB-INF/lib/MySpecialLib-1.2.jar</systemPath>
    </dependency>

【讨论】:

以上是关于从现有 jar 创建 maven 工件的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

用于创建临时 zip 工件的 Maven 最佳实践

当它们包含我创建的工件时,如何指示 maven 自动添加依赖项 jar?

maven-jar-plugin:如何为测试创建不同的工件名称?

如何从工件注册表(GCP)下载 jar?

将 ojdbc8.jar 添加到 Eclipse/maven 项目的正确方法

现有工件的 Maven 解析失败