【问题标题】:How to import all dependencies of a jar?如何导入jar的所有依赖项?
【发布时间】:2018-07-11 06:26:58
【问题描述】:

我有两个 java maven 项目 - eclipse 中的 abc 和 intellij idea 中的 xyz。它们有一些常见的 jar 依赖项。

在 xyz 代码中,我需要调用 abc 的 test 目录中的一些代码。因此,我将 abc 转换为 jar 并将其导入到 xyz 中。调用 abc 方法的 xyz 代码编译得很好,但是因为找不到 abc 所需的 jar 而失败。其中一些缺失的 jar 实际上存在于 xyz 中,但有些则没有。

如何让 xyz 导入 abc 所需的所有依赖项?这是重用代码的好方法吗?

【问题讨论】:

  • 你是如何导入 abc JAR 的?正确的方法是将 abc 包安装到本地 Maven repo (mvn install),然后将其添加到 xyz 的依赖项中。
  • @juzraai - 我确实没有将 abc jar 添加到本地 m2 存储库。我将它添加到某个随机文件夹,然后将其添加到项目中。如何将 abc 添加到本地 m2 存储库?
  • 进入 abc 目录并从终端调用mvn install

标签: java maven dependencies


【解决方案1】:

这样做的正确方法:

  1. 通过在“abc”文件夹中运行mvn install 将“abc”项目安装到本地 Maven 存储库中。 (这将首先构建项目,然后将 JAR 和 POM 复制到本地 Maven 存储库中。)
  2. 并将其作为依赖项添加到“xyz”项目中:
<dependencies>
  <dependency>
    <groupId>...</groupId>
    <artifactId>abc</artifactId>
    <version>...</version>
  </dependency>
</dependencies>

这样,“xyz”项目在类路径上也会有“abc”和“abc”的依赖。

编辑:重用测试类can be done this way

  1. 在“abc”中添加maven-jar-plugin 以构建具有test-jar 目标的插件,从而创建测试类的JAR:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                <goals>
                    <goal>test-jar</goal>
                </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. 安装“abc”(将安装常规 JAR、测试 JAR 和 POM)
  2. 添加为依赖项并引用test-jar 分类器:
<dependencies>
    <dependency>
      <groupId>...</groupId>
      <artifactId>abc</artifactId>
      <version>...</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
</dependencies>

【讨论】:

  • 谢谢。安装现在正在运行。顺便说一句,这个 jar 是否也有 abc 的测试目录? xyz 需要用到 abc 的 test 目录下的类。
  • 不,但我为这种情况添加了步骤,请参阅我编辑的答案。
  • 我很抱歉,但我忘了提及这一点。测试类使用一些(不是全部)主目录(POJO)类。这些信息会改变你的答案吗?
  • 如何跳过运行所有单元和功能测试?运行功能测试需要很长时间。
  • 我认为您应该将普通 JAR 和测试 JAR 也添加到 xyz 的依赖项中。您可以通过在 Maven 命令中添加 -DskipTests 参数来跳过测试。
【解决方案2】:

还有其他几种方法。

  • 如果 abc 和 def 项目,有一些类似的功能,你 可以将它们组合在模块中,并在您的 项目,并将两个项目配置为模块,从而有效 在一个地方共享所有依赖项,即。父 pom,这个 还有助于保持所有其他依赖项的版本 持续的。检查此链接以了解如何做到这一点

    https://books.sonatype.com/mvnex-book/reference/multimodule-sect-simple-parent.html

  • 另一方面,如果 abc 项目只需要 def 作为 abc 测试的依赖项,那么您可以导入 def 作为测试范围依赖项。 这意味着它仅在测试范围内可用。这意味着什么 正常使用不需要依赖项 应用程序,并且仅可用于测试编译和 执行阶段,也不是传递的。 所以,是这样的:-

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2013-01-19
    • 2021-09-07
    相关资源
    最近更新 更多