ChatGPT解决这个技术问题 Extra ChatGPT

Maven:如何将代表中不可用的 jar 包含到 J2EE 项目中?

在我的 J2EE 项目中,我有几个依赖项,它们在任何 Maven 存储库中都不可用,因为它们是专有库。这些库需要在运行时可用,因此必须复制到 target/.../WEB-INF/lib ...

现在,我在我的 POM 中将它们列为系统依赖项,但是使用这种方法的问题是,在编译期间它们没有被复制到目标构建中。这种方法也不是很优雅。

那么将它们集成到 Maven 中的最佳方式是什么?

注意:我不想创建自己的 Maven 存储库。

我真的认为你应该重新审视你创建 Maven 存储库的决定。这一点也不难,而且 100% 值得。
创建 Maven 存储库的价值取决于具体情况。

R
Ric Jafe

对于想要快速解决此问题的人:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

只需给您的库一个唯一的 groupID 和工件名称,并指向它在文件系统中的位置。你已准备好出发。

当然,这是一个肮脏的快速修复,只能在您的机器上运行,并且如果您不更改库的路径。但有时,这就是你想要的,运行并做一些测试。

编辑:只是重新提出问题并意识到用户已经在使用我的解决方案作为临时修复。我会留下我的答案,作为对这个问题的其他人的快速帮助。如果有人不同意这一点,请给我留言。 :)


凉爽的。有没有办法指定 URL 而不是本地机器路径?
感谢您提供完整且有效的示例!!!我希望你钓到一条金鱼,它会给你三个愿望。 :)
这应该是公认的答案,因为它是独立的(在 pom.xml 中)
嗨 Rajarshee,组和工件 ID 是完全任意的。文件系统中 jar 的路径对于此工作至关重要。因为实际上 jar 不是 maven 依赖项,所以您只是告诉 Maven 将其视为一个。
截至 2016 年,这似乎不起作用。构建承认路径,但不包括阴影 jar 中的代码。老鼠...
P
Paul Verest

正如您所说,您不想建立自己的存储库,也许这会有所帮助。

您可以使用 maven-install-plugin 的 install-file goal 将文件安装到本地存储库。如果您为每个文件创建一个带有 Maven 调用的脚本并将其保存在 jar 旁边,您(以及任何其他有权访问的人)可以轻松地将 jar(和相关的 pom 文件)安装到他们的本地存储库中。

例如:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

要不就

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

然后,您可以在项目中正常引用依赖项。

但是,最好的办法仍然是建立一个内部远程存储库,我建议自己使用 Nexus。如果需要,它可以在您的开发盒上运行,而且开销很小。


谢谢这种方法现在对我很好。我扩展了 POM,以便将文件自动安装到本地代表:pastebin.ca/1504318
很高兴提供帮助,但正如其他人所说,最好的方法是使用 Maven 存储库管理器。这种方法不能很好地扩展。
对我有用的命令:“mvn install:install-file -Dfile=cassandra-jdbc-1.1.1.jar -DgroupId=org.apache-extras.cassandra-jdbc -DartifactId=cassandra-jdbc -Dversion=1.1.1 -D包装=罐子“
m
mostar

在您的项目下创建一个存储库文件夹。让我们来

${project.basedir}/src/main/resources/repo

然后,将您的自定义 jar 安装到此 repo:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

最后,将以下 repo 和依赖项定义添加到项目 pom.xml 中:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

这对我来说效果很好。 PS我会为本地仓库推荐一个不同的目录,因为将它放在“src”中似乎不正确(它不是源代码!)
它就像一个魅力。我正在将一个旧项目从 Ant 迁移到 Maven,并且在 Web 存储库中找不到一些库。
注意:当 -DlocalRepositoryPath 的值不以 / 结尾(即表示文件夹)时,则使用 groupId 创建 repo。例如:如果组 id 为 foo.com 并且 localRepositoryPath 为 repo,则 repo 文件夹变为 repo.foo.com
此过程作为系统存储库管理的本地项目,使用主要用于 Java 项目和文件系统的 maven 构建自动化工具。
G
Gregory Mostizky

您需要设置一个本地存储库来托管此类库。有许多项目正是这样做的。例如 Artifactory


关于术语的一点,这些是内部远程存储库,而不是本地存储库。本地存储库是本地文件系统依赖项下载到的一个。
A
Apurva Singh

如果您使用 Jenkins 构建,所有解决方案都不起作用!!当 pom 在 Jenkins 构建服务器中运行时,这些解决方案将失败,因为 Jenkins 运行 pom 将尝试从企业存储库下载这些文件。

复制 src/main/resources/lib 下的 jars(创建 lib 文件夹)。这些将成为您项目的一部分,并一直到部署服务器。在部署服务器中,确保您的启动脚本在类路径中包含 src/main/resources/lib/*。中提琴。


d
dfa

您可以将它们安装在私有的本地存储库中(例如,您的主目录下的 .m2/repository):more details here


是的,我可以这样做,但是我必须告诉每个想要构建项目的人,他必须将文件 X、Y 放在目录 Z 中,这确实使事情变得复杂。毕竟我想使用 Maven 来简化构建过程。
i
ipingu

如果我理解得很好,如果你想做的是在编译阶段导出依赖项,这样就不需要手动检索每个需要的库,你可以使用 mojo copy-dependencies

希望它对您的情况有用(examples


C
Community

@Ric Jafe 的解决方案对我有用。

这正是我一直在寻找的。一种将其推向研究测试代码的方法。没有什么花哨。是的,我知道他们都是这么说的 :) 各种 Maven 插件解决方案对于我的目的来说似乎是矫枉过正。我有一些罐子作为带有 pom 文件的 3rd 方库提供给我。我希望它能够快速编译/运行。这个我很容易适应 python 的解决方案为我创造了奇迹。剪切并粘贴到我的 pom 中。此任务的 Python/Perl 代码在此问答中:Can I add jars to maven 2 build classpath without installing them?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

上述解决方案返回 'dependencies.dependency.systemPath' 的 xx.jar 不应指向项目目录中的文件。请参阅stackoverflow.com/questions/10935135/…
C
Corehpf

继续使用它们作为系统依赖并使用 Maven 依赖插件将它们复制到 target/.../WEB-INF/lib ...:

http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html


J
Jonathan Hendler

单独安装对我不起作用。

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3