从现有 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 中声明一个 <dependency>
元素,就像任何其他依赖项一样,例如:
<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 工件的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
当它们包含我创建的工件时,如何指示 maven 自动添加依赖项 jar?
maven-jar-plugin:如何为测试创建不同的工件名称?