Maven:如何将reps中没有的jar包含到J2EE项目中?

时间:2009-07-22 09:14:43

标签: java maven-2 build-process

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

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

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

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

11 个答案:

答案 0 :(得分:186)

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

<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的路径。但有时候,这就是你想要的,跑步和做一些测试。

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

答案 1 :(得分:52)

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

您可以使用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。如果需要,它可以在您的开发盒上运行,并且开销很小。

答案 2 :(得分:23)

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

${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>

答案 3 :(得分:8)

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

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

答案 8 :(得分: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

答案 9 :(得分:1)

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

这正是我想要的。一种推动研究测试代码的方法。没有什么花哨。是的我知道这就是他们所说的:)各种maven插件解决方案似乎对我的目的来说太过分了。我有一些罐子作为带有pom文件的第三方库提供给我。我希望它能够快速编译/运行。这个我很容易适应python的解决方案为我创造了奇迹。剪切并粘贴到我的pom中。此任务的Python / Perl代码位于此Q&amp; A: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

答案 10 :(得分:0)

您可以尝试使用maven-external-dependency-plugin,它显示了将外部jar添加到任何Maven项目的好方法。

https://code.google.com/p/maven-external-dependency-plugin/