Maven:如何将jar(JR实例中没有的jar)包含到J2EE项目中?


100

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

现在,我在POM中将它们列为系统依赖项,但是使用这种方法的问题是,在编译过程中没有将它们复制到目标版本中。而且这种方法也不是很优雅。

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

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


7
真的认为您应该查看有关创建Maven存储库的决定。这一点都不难,而且100%值得。
罗伯特·蒙提亚努

7
创建Maven存储库的价值取决于具体情况。
yincrash 2012年

Answers:


54

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

您可以使用maven-install-plugin 的install-file目标将文件安装到本地存储库。如果使用每个文件的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。如果需要,它可以在您的开发箱上运行,并且开销很小。


1
谢谢,这种方法现在对我有用。我扩展了POM,以便将文件自动安装到本地代表:pastebin.ca/1504318
samson

很高兴能提供帮助,但是正如其他人所说,最好的方法是使用Maven存储库管理器。这种方法无法很好地扩展。
Rich Seller

4
对我有用的命令:“ mvn install:install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar“
Mazrick 2012年

193

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

<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和工件名称,然后指向它在文件系统中的位置即可。你已准备好出发。

当然,这是一个肮脏的快速修复程序,仅在您的计算机上有效,并且如果您不更改libs的路径。但是有时候,这就是您想要的,可以运行并进行一些测试。

编辑:重新提出问题,并意识到用户已经在使用我的解决方案作为临时解决方案。我会把我的答案留给其他人快速解决。如果有人不同意这一点,请给我评论。:)


4
凉。有没有一种方法可以指定URL而不是本地计算机路径?
phreakhead

3
谢谢您提供一个完整而有效的示例!!!希望您能抓到一条金鱼,并给您三个愿望。:)
johndodo 2013年

14
这应该是被接受的答案,因为它是独立的(在pom.xml中)
Vikram

2
嗨Rajarshee,组和工件ID完全是任意的。文件系统中jar的路径对于此工作至关重要。因为实际上jar不是Maven依赖项,所以您只是告诉Maven像对待它一样。
Ric Jafe 2015年

1
截至2016年,这似乎无效。生成确认路径,但不将代码包含在阴影jar中。大鼠...
markthegrea '16

24

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

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

然后,将自定义jar安装到此仓库中:

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

最后,将以下回购和依赖项定义添加到项目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>

1
这对我来说非常有效。附注:我会为本地存储库推荐一个不同的目录,因为将其放在“ src”中似乎不正确(它不是源代码!)
davidfrancis

1
它像魅力一样运作。我正在将一个旧项目从Ant迁移到Maven,并且在网络存储库中找不到一些库。
Paulo Pedroso

注意:-DlocalRepositoryPath的值未以/(即表示文件夹)结尾时,将使用groupId创建该仓库。例如:如果组ID是foo.com并且localRepositoryPath是repo,则repo文件夹将变为repo.foo.com
Sheshadri Mantha '17

该过程是使用主要用于Java项目和文件系统的maven构建自动化工具进行的系统存储库管理本地项目。
Oleksii Kyslytsyn


3

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

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


2

您可以将它们安装在私有的本地存储库中(例如,主目录下的.m2 / repository):此处有更多详细信息


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


2

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

这正是我想要的。一种用于研究测试代码的方法。没有什么花哨。是的,我知道那就是他们所说的:)出于我的目的,各种maven插件解决方案似乎都过分了。我有一些罐子作为带有pom文件的第三方库提供给我。我希望它可以快速编译/运行。我平常适应python的解决方案为我带来了奇迹。剪切并粘贴到我的pom中。这个问题的Python / Perl代码在以下问答中:是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?

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

上面的解决方案返回xx.jar的'dependencies.dependency.systemPath'不应指向项目目录中的文件。见stackoverflow.com/questions/10935135/...
sarah.ferguson


1

单独安装对我不起作用。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.