【问题标题】:Maven and eclipse: a reliable way to add non-Maven or external jars to a project?Maven 和 Eclipse:向项目添加非 Maven 或外部 jar 的可靠方法?
【发布时间】:2013-02-24 16:29:31
【问题描述】:

Maven 很棒。它主要通过在pom 配置中指定依赖包的版本来让我远离jar 依赖地狱,并自动应用它们。它还通过 m2e 与 Eclipse 进行了很好的集成,因此可以在 IDE 中无缝运行。

这对于 Maven 全局已知的依赖项来说非常有用。但是,有时,有些库需要包含在 Maven 存储库中不可用的项目中。在这种情况下,我通常将它们添加到我项目中的lib/ 目录中。只要它们在类路径中,就可以编译。

但是,问题是在导入项目时自动包含它们。长期以来,我一直在通过半生不熟的修复和黑客攻击来容忍这个问题。每次有人安装这个项目时,我都必须告诉他们手动将lib/ 中的 jar 添加到他们的 Eclipse 构建路径中,这样所有错误都会消失。类似于以下内容:

我正在寻找一种方法来自动化这个过程,这种方法可以同时与mvn 命令行程序和 Eclipse 一起使用:更多的是强调 Eclipse,因为有项目在导入时就可以编译是件好事.

我不想为此设置一个 repo 服务器,我也没有任何内部专有组件可以保证在本地设置任何东西。我只有一些开发人员不使用 Maven 的 jar 文件;我想和他们一起编译...我应该能够将它们包含在我的软件分发中,对吧?

我真的在寻找一种合理的方法来实现这一点,它也可以在 Eclipse 中轻松工作。 This is one solution 我发现很有希望,但是 这个问题似乎没有权威的解决方案。唯一接近的另一件事是maven-addjars-plugin,它可以正常工作,但只能在命令行上使用。这个插件还不错,配置也很合理:

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

但是,试图让它在 Eclipse 中运行涉及将以下关于生命周期映射的混乱添加到您的 pom.xml,我从未开始工作;我什至不认为它被配置为实际向 Eclipse 构建路径添加任何内容。

<pluginManagement>
    <plugins>
        <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
        <plugin>
            <groupId>org.eclipse.m2e</groupId>
            <artifactId>lifecycle-mapping</artifactId>
            <version>1.0.0</version>
            <configuration>
                <lifecycleMappingMetadata>
                    <pluginExecutions>
                        <pluginExecution>
                            <pluginExecutionFilter>
                                <groupId>
                                    com.googlecode.addjars-maven-plugin
                                </groupId>
                                <artifactId>
                                    addjars-maven-plugin
                                </artifactId>
                                <versionRange>
                                    [1.0.5,)
                                </versionRange>
                                <goals>
                                    <goal>add-jars</goal>
                                </goals>
                            </pluginExecutionFilter>
                            <action>
                                <execute />
                            </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

【问题讨论】:

  • 我更喜欢依赖本地 nexus 安装。
  • 我希望能够把这个软件给别人使用,这样看来不合理。只是想分享几个罐子而已,应该没那么复杂。
  • Nexus(或任何其他 repo 实现)将有助于您的构建过程,因此您的用户不需要它;而如果你是 FOSS,maven-izing 其他库和向上游发送补丁将为社区做出贡献。无论如何,你的选择。
  • 用户不需要它;我需要它供其他在 github 上查看代码的人使用。我有一些插件和代码(一些来自封闭源代码),maven-ize 是不可行的,期望能够为每个依赖项都这样做是不合理的。

标签: java eclipse maven m2eclipse m2e


【解决方案1】:

在我看来,您可以使用Maven Resources Plugin 为您执行此操作。只需将资源的复制绑定到适当的生命周期阶段(编译之前的阶段)。您很可能需要调整 maven-compiler-plugin,以便这些库在编译和运行时位于类路径中。

【讨论】:

    【解决方案2】:

    您可以使用 maven 使用 maven-install-plugin 将文件从 project\lib 文件夹安装到本地 repo,如下所示。我以前用 JDBC 驱动程序做过这个。您可能必须为它创建一个单独的 pom 并使用 mvn -f installdeps.pom 或类似的东西执行它。

    如果你能让它运行良好并与 validate 之类的生命周期绑定,那么你可以将 m2e 插件与 Eclipse 一起使用,它可能会运行良好并直接从 pom.xml 读取依赖项并将 jar 安装为需要本地仓库。

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

    【讨论】:

    • 为什么孩子不能安装非maven jars?请解释一下。
    【解决方案3】:

    1) 可以使用系统范围依赖

        <dependency>
            <groupId>test</groupId>
            <artifactId>x</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/x.jar</systemPath>
        </dependency>
    

    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>
    

    【讨论】:

    • 这正是我所需要的。它还使 jar 可用于依赖于这个的项目。与 Eclipse 完美集成,避免了其他人建议的所有这些管理 repo 和 XML。也不涉及将废话复制到 Maven 存储库中。如果可以的话,+100 票。
    • @Andrew Mao 很好,如果这个解决方案适合你。当心system scope dependencies are similar to "provided" dependencies这一事实。因此,它们应该存在于目标平台上,并且不会包含在打包的工件(例如 war 文件)中。
    • 我发现系统范围会影响下游对瞬态依赖项的处理,我们无法使用它。我相信正确的方法是在本地存储库中安装(手动或脚本)您需要的工件。
    • 如果我使用系统范围,groupIdartifactId 是否相关? (即我可以在这些字段中放任何东西吗?)由于这些罐子不在 Maven 存储库中,我假设它们无关紧要?
    • 它们可以是除了空的任何东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多