Java Maven和eclipse:向项目添加非Maven或外部JAR的可靠方法?
马文很棒。它主要通过在Java Maven和eclipse:向项目添加非Maven或外部JAR的可靠方法?,java,eclipse,maven,m2eclipse,m2e,Java,Eclipse,Maven,M2eclipse,M2e,马文很棒。它主要通过在pom配置中指定依赖包的版本并自动应用它们来避免jar依赖地狱。它还通过m2e与Eclipse进行了很好的集成,以便在IDE中无缝地工作 这对于Maven全局已知的依赖项来说是非常好的。但是,有时,有些库需要包含在项目中,而Maven repos中不可用。在这种情况下,我通常将它们添加到项目中的lib/目录中。只要它们在类路径中,就可以编译 但是,问题是在导入项目时要自动包含它们。我容忍这个问题的时间太长了,我的补丁和黑客都不成熟。每次有人安装这个项目时,我都必须告诉他们手
pom
配置中指定依赖包的版本并自动应用它们来避免jar依赖地狱。它还通过m2e与Eclipse进行了很好的集成,以便在IDE中无缝地工作
这对于Maven全局已知的依赖项来说是非常好的。但是,有时,有些库需要包含在项目中,而Maven repos中不可用。在这种情况下,我通常将它们添加到项目中的lib/
目录中。只要它们在类路径中,就可以编译
但是,问题是在导入项目时要自动包含它们。我容忍这个问题的时间太长了,我的补丁和黑客都不成熟。每次有人安装这个项目时,我都必须告诉他们手动将lib/
中的jar添加到他们的Eclipse构建路径中,以便消除所有错误。如下所示:
我正在寻找一种方法来自动化这个过程,这种方法可以与mvn
命令行程序和Eclipse一起使用:更多地强调Eclipse,因为在导入项目时,让项目能够编译是很好的
我不想为此设置回购服务器,也没有任何内部专有组件可以保证在本地设置任何内容。我只是有一些开发人员不使用Maven的jar文件;我想用它们进行编译……我应该能够将它们包括在我的软件发行版中,对吗?
我真的在寻找一种合理的方法来实现这一点,这种方法在Eclipse中也能正常工作。我发现很有希望,但是
对于这个问题,似乎没有权威的解决方案。另一个接近的东西是,它可以正常工作,但只在命令行上。这个插件不错,配置非常合理:
<plugin>
<groupId>com.googlecode.addjars-maven-plugin</groupId>
<artifactId>addjars-maven-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<goals>
<goal>add-jars</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${project.basedir}/lib/java-aws-mturk</directory>
</resource>
<resource>
<directory>${project.basedir}/lib/not-in-maven</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
在我看来,你可以用这个来为你做这件事。只需将资源复制绑定到适当的生命周期阶段(编译之前的阶段)。您很可能需要调整maven编译器插件,使这些库在编译时和运行时位于类路径上。您可以使用maven安装插件使用maven将文件从project\lib文件夹安装到本地repo,如下所示。我以前用JDBC驱动程序做过这件事。您可能需要为它创建一个单独的pom,并使用mvn-f installedeps.pom或类似的东西来执行它 如果你能让它玩得很好,并绑定一个生命周期,比如validate之类的东西,那么你可以将m2e插件与Eclipse一起使用,它可能会玩得很好,直接从pom.xml读取依赖项,并根据需要将JAR安装到本地repo
<plugin>
<!-- We dont want children attempting to install these jars to the repo. -->
<inherited>false</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>Microsoft JDBC Driver File 1</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/sqljdbc4.jar</file>
<groupId>com.microsoft</groupId>
<artifactId>microsoft-jdbc-driver</artifactId>
<version>4.0</version>
<packaging>jar</packaging>
</configuration>
</execution>
<execution>
<id>ojdbc5</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/ojdbc5.jar</file>
<groupId>com.oracle</groupId>
<artifactId>ojdbc5</artifactId>
<version>11.1.2</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
假的
org.apache.maven.plugins
maven安装插件
Microsoft JDBC驱动程序文件1
安装
安装文件
lib/sqljdbc4.jar
com.microsoft
microsoft jdbc驱动程序
4
罐子
ojdbc5
安装
安装文件
lib/ojdbc5.jar
com.oracle
ojdbc5
11.1.2
罐子
1)您可以使用系统范围依赖关系
<dependency>
<groupId>test</groupId>
<artifactId>x</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/x.jar</systemPath>
</dependency>
测试
x
1
系统
${basedir}/lib/x.jar
2) 您可以将x.jar复制到本地maven存储库,如下所示:
repository/test/x/1.0/x-1.0.jar
并将依赖项添加为
<dependency>
<groupId>test</groupId>
<artifactId>x</artifactId>
<version>1.0</version>
</dependency>
测试
x
1
我更喜欢依赖本地nexus安装。我希望能够将此软件提供给其他人使用,因此这似乎不合理。我只想分享几个JAR,所以不会那么复杂;如果你是自由和开放源码软件,那么开发他人的库并向上游发送补丁将有助于社区的发展。不管怎样,这是你的选择。我不需要用户使用它;我需要它来帮助其他在github上查看代码的人。我有一些插件和代码(一些来自封闭源代码),maven-ize是不可行的,并且期望能够对每个依赖项都这样做是不合理的。参考这篇文章,这正是我所需要的。它还使JAR可用于依赖于此JAR的项目。与Eclipse完美集成,避免了所有其他人所建议的管理repo和XML。也不涉及将垃圾复制到Maven存储库中+如果可以的话,投100票。@Andrew Mao如果这个解决方案对你有效,那就好了。当心这个事实,那就是。因此,它们应该存在于目标平台上,并且不会包含在打包的工件(例如war文件)中。我发现系统范围会影响下游瞬态依赖关系的处理,我们无法使用它。我认为正确的方法是在本地存储库中安装(手动或脚本化)所需的工件。如果我使用系统范围,groupId
和artifactId
是否相关?(即,我可以在这些字段中输入任何内容吗?)由于这些JAR不在Maven repos中,我假设它们不重要?它们可以是任何东西,但Empy为什么孩子们不能安装非Maven JAR?请解释一下。
<dependency>
<groupId>test</groupId>
<artifactId>x</artifactId>
<version>1.0</version>
</dependency>