【问题标题】:Maven jar dependencies and relationsMaven jar 依赖和关系
【发布时间】:2012-05-30 02:26:07
【问题描述】:

我试图搜索现有问题,但找不到任何问题 - 感觉我的问题很简单,但可能是因为它非常具体,我无法在任何地方找到答案。

无论如何 - 我有 2 个使用 Maven 的项目,其中第二个依赖/需要第一个的某些类。在某些情况下,我希望依赖于 JAR 而不是项目依赖。

我通过使用 maven-jar-plugin 创建了一个额外的 jar 来解决这个问题,我在其中包含了所需的类。 jar 已正确创建并在 ${project.build.directory} 中输出。但是项目 A 的 pom 位于同一目录中,这对我和项目 B 来说都是痛苦的,因为项目 A 中使用了依赖项。 (有没有办法忽略 ${project.build.directory} 中的 pom ??? 比如:

<dependency>
            <groupId>projectA.groupId</groupId>
            <artifactId>A</artifactId>
            <version>1x-SNAPSHOT</version>
            <classifier>classes</classifier>
                    ->  <ignorePom>true</ignorePom>
        </dependency>

)。

现在我将系统范围用于依赖项,并且在添加系统路径后它可以正常工作。尽管在任何可能的地方都必须避免使用示波器系统。 Systempath 让我很恼火,因为这不是一个好的做法,而且是绝对路径。

我知道我可以使用

将创建的 jar 安装到存储库中

mvn install:install -file

但我想尽可能地自动化这个过程,你有什么建议?

提前致谢

【问题讨论】:

    标签: eclipse maven dependencies pom.xml maven-jar-plugin


    【解决方案1】:

    最好的解决方案是使用存储库管理器并真正发布第一个 jar,并在您需要的地方建立真正的依赖关系。

    根据您所写的内容,我建议创建一个单独的 maven 项目,其中包含将由其他几个模块使用的类,然后发布它并简单地使用对该模块的依赖。这将彻底解决您的问题。

    【讨论】:

    • 感谢 khmarbaise,事实上我创建了一个单独的 maven 项目,其中包含公共类。我已经有了这个想法,但我认为可能还有其他解决方案。
    【解决方案2】:

    Maven 不支持“依赖于 jars”。有“系统”的范围,但非常有限,可能会导致各种麻烦。如果你需要依赖一个 Jar,你需要给它分配一个唯一的 groupId 和 artifactId。如果您不想在 Maven 中构建它,可以将其部署到本地 repo 管理器(甚至使用 mvn install:install-file 部署到本地 repo)。

    取决于带有分类器“工作”但不是很好的 jar,因为反应器无法正确地将它们包含在多模块项目中。

    【讨论】:

      【解决方案3】:

      您是否阅读过任何有关Maven 的文档?如果您的项目是使用 Maven 定义的,那么您无需执行任何特殊操作即可使依赖项正常工作。

      根据您的需要,您有两种选择:创建两个独立的项目,其中一个依赖于另一个,或者您可以创建一个多模块项目,其中一个模块仍然依赖于另一个。

      两个独立的项目

      .
       |-- A
       |   `-- pom.xml
       |   `-- src
       |       `-- main
       |           `-- java
       `-- B
           `-- pom.xml
           `-- src
               `-- main
                   `-- java
      

      A/pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.company</groupId>
          <artifactId>A</artifactId>
          <version>1.0-SNAPSHOT</version>
      </project>
      

      B/pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.company</groupId>
          <artifactId>B</artifactId>
          <version>2.0-SNAPSHOT</version>
      
          <dependencies>
              <dependency>
                  <groupId>com.company</groupId>
                  <artifactId>A</artifactId>
                  <version>1.0-SNAPSHOT</version>
              </dependency>
          </dependencies>
      </project>
      

      就是这样!您对 B 中的项目/模块 A 有依赖。

      您首先通过发出mvn install(并位于目录A)来构建项目A。该工件将安装在您的本地存储库中(并可用于其他项目)。

      然后您通过发出mvn install(并且位于目录B 中)来构建项目B。该工件将安装在您的本地存储库中。

      一个带有子模块的父项目

      .
       |-- A
       |   `-- pom.xml
       |   `-- src
       |       `-- main
       |           `-- java
       `-- B
       |   `-- pom.xml
       |   `-- src
       |       `-- main
       |           `-- java
       `-- pom.xml
      

      pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.company</groupId>
          <artifactId>parent</artifactId>
          <packaging>pom</packaging>
          <version>1.0-SNAPSHOT</version>
      
          <modules>
              <module>A</module>
              <module>B</module>
          </modules>
      
          <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>com.company</groupId>
                      <artifactId>A</artifactId>
                      <version>${project.version}</version>
                  </dependency>
              </dependencies>
          </dependencyManagement>
      
      </project>
      

      &lt;depencdencyManagement/&gt; 可以帮助子模块选择正确的版本。

      A/pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <parent>
              <groupId>com.company</groupId>
              <artifactId>parent</artifactId>
              <version>1.0-SNAPSHOT</version>
          </parent>
      
          <groupId>com.company</groupId>
          <artifactId>A</artifactId>
      
      </project>
      

      B/pom.xml

      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <parent>
              <groupId>com.company</groupId>
              <artifactId>parent</artifactId>
              <version>1.0-SNAPSHOT</version>
          </parent>
      
          <groupId>com.company</groupId>
          <artifactId>B</artifactId>
      
          <dependencies>
              <dependency>
                  <groupId>com.company</groupId>
                  <artifactId>A</artifactId>
              </dependency>
          </dependencies>
      </project>
      

      使用此解决方案,您只需将自己定位在父文件夹中并运行mvn install(或mvn package 等)。您现在将以正确的顺序构建 A 和 B,并且整个项目都可以导入到 Eclipse 中。

      【讨论】:

      • Hallo maba,我认为您误解了这个问题:我提到“在某些情况下,我希望依赖于 JAR 而不是项目依赖。”我必须从项目 A 中创建一个 jar,否则我会遇到两个项目的公共依赖项和库的问题。
      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2012-07-04
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2014-02-26
      相关资源
      最近更新 更多