如何在 Maven 项目中包含本地 jar 文件 [重复]

Posted

技术标签:

【中文标题】如何在 Maven 项目中包含本地 jar 文件 [重复]【英文标题】:How to include local jar files in Maven project [duplicate] 【发布时间】:2011-04-15 12:28:33 【问题描述】:

我不想在 Maven 存储库(本地/远程)中安装一些 jar。特别是我有一些 jar 文件位于

c:\work\projects\myapp\src\main\webapp\WEB-INF\lib\test.jar

c:\work\projects\myapp\src\main\webapp\WEB-INF\lib\test2.jar

使用 NetBeans 打开/编辑时如何将它们包含到我的项目中?

【问题讨论】:

我希望我可以使用system 作用域依赖项来销毁、烧毁、发送所有这些问题。我一直在写against this practice,但遗憾的是,它没有帮助...... 【参考方案1】:

虽然使用 systemPath 引用是可行的,但最好创建一个本地存储库。幸运的是,这很容易做到。

创建一个本地存储库,其中包含公共存储库中不可用的 jars

注意:我使用 Eclipse,因此某些说明是特定于 Eclipse 的。大多数都很容易推广。


假设

jar 是由 Maven 在另一个项目中创建的,具有以下内容...

<groupId>com.foo</groupId>
<artifactId>test</artifactId>
<version>0.1.1</version>
<packaging>jar</packaging>

在项目中(想要访问 jars)

在项目基础目录之外创建 repo 目录 对于要在本地访问的每个 jar... 为 groupID 的每个级别添加目录(例如 /repo/com/foo) 添加不带版本的 jar 名称(又名 artifactId)(例如 /repo/com/foo/test) 为 jar 版本添加目录(例如 /repo/com/foo/test/0.1.1) 将 jar 放入该目录(例如 /repo/com/foo/test/0.1.1/test-0.1.1.jar

在 pom.xml 中(对于想要访问 jars 的项目)

定义本地仓库

<repositories>
  <repository>
    <id>data-local</id>
    <name>data</name>
    <url>file://$project.basedir/repo</url>
  </repository>
</repositories>

添加对本地 jar 的依赖。从我们上面的例子来看,这将是......

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>test</artifactId>
  <version>0.1.1</version>
</dependency>

重建

Rt 点击 pom.xml -> 运行方式 -> Maven 构建

【讨论】:

如果您只想授予对子模块中 jar 的访问权限,您需要做什么?我按照说明进行操作,并将存储库定义添加到我的子模块 pom 中,但 maven 在构建时似乎忽略了此存储库。 该死,我的包装是pom,它不允许它导入。使其 jar 后跟 mvn clean install -U 使其可以添加为 maven &lt;dependency&gt; 这是正确答案;它遵循 Maven 的意识形态,并且像魅力一样工作。 嗯,对于 Maven 3,还有一些事情要做,比如重命名 jar 以包含版本号,以及向每个目录添加一个 pom 文件。幸运的是有人已经在这里写了gist.github.com/timmolderez/92bea7cc90201cd3273a07cf21d119eb 此方法适用于 jar-with-dependencies,而 system 方法则不适用。【参考方案2】:

您是否考虑将这两个 JAR 添加为 system dependencies?例如,

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sun.jdk</groupId>
      <artifactId>tools</artifactId>
      <version>1.5.0</version>
      <scope>system</scope>
      <systemPath>$java.home/../lib/tools.jar</systemPath>
    </dependency>
  </dependencies>
  ...
</project>

请注意,不建议这样做,如果有的话,应该非常谨慎地使用。

【讨论】:

@Pascal Thivent:尽管您声明我应该得到-10,但我还是赞成您的评论。 :) 我完全同意你的看法。我在假设@cometta 有他/她使用它的理由的情况下写了我的答案。就个人而言,我讨厌有人说“但你不应该那样做!”当我问一个问题时。我会更新我的答案,指出这是非常不推荐的。 也许我评论的最后一部分没有必要(请注意,我实际上并没有否决您的答案)。至少,这不是惩罚的呼吁,而是沮丧的尖叫:)我会重新发布一个更友好的版本。 这确实是一种邪恶的做法,强烈discouraged。每次有人使用它,上帝都会杀死一个 Maven 开发者。 我不赞同你不推荐这种做法的热情。在源代码控制构建、无法访问本地 maven 存储库和团队项目的情况下,这是提供公共存储库中不可用的依赖项的唯一明智的解决方案... @jfernand - "...这是唯一理智的解决方案...",实际上,它不是唯一理智的解决方案。查看其他答案。【参考方案3】:

过去,我通过在项目本身中创建“本地”存储库目录树并通过使用项目相对路径声明本地存储库来在 POM 中引用它来完成此操作。

但这是一个黑客。 (也许不是那么 hacky - 根据@Pascal 的评论。尽管使用了一年左右,但我仍然是一个 Maven 新手。)

【讨论】:

这是一个比邪恶系统范围hack更好的解决方案。人们一直在使用系统范围(并推荐它)而不了解它是如何伤害的……这令人沮丧。 很高兴听到这对您有用。您能否更新您的答案以解释我如何使这种技术对我有用?【参考方案4】:

其他答案都不适合我。我不得不运行一个稍微不同的命令...

mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/ -Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0

查看本文中的完整步骤:https://devcenter.heroku.com/articles/local-maven-dependencies

【讨论】:

如果您的本地 jar 有一个 pom.xml 文件(例如,因为您自己构建了它),那么您可以使用 -DpomFile=&lt;path-to-pom&gt; 指向它。然后从 pom 文件中提取 groupIdartifactIdversionpackaging 参数。见maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html

以上是关于如何在 Maven 项目中包含本地 jar 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 maven jar 构建过程中包含外部 jar?

如何在 Maven 生成的 jar 中包含特定文件夹?

收到一个主 jar 文件,其中包含需要在类路径中的其他 jar 文件。在我的 Maven 项目中包含这个主 jar 的最佳方法是啥?

在打包的 JAR 中包含本地依赖项 [重复]

如何把java项目完整的上传到linux服务器上去,项目中包含jar包?

如何教 Eclipse 在源路径中包含 Maven 源包?