【问题标题】:Maven - how to manage multiple jar with dependencies in commonMaven - 如何管理具有共同依赖关系的多个 jar
【发布时间】:2019-09-03 07:40:16
【问题描述】:

我有一个大项目,它由几个较小的项目组成,每个项目都有一个pom.xml。有些项目是其他项目的依赖项。感谢 maven,我的工作方式是生成一些独立的阴影 jarwar 文件。

我遇到的问题是我有一个新的自定义项目,它依赖于主项目中的类。问题是这个项目包含一个自定义类,因此,生成的jar 文件随后会添加到应用程序中。

首先,我考虑将包含所有依赖项的自定义项目编译成带阴影的jar。但是,在运行该应用程序时,我收到了一个转换错误:

java.lang.ClassCastException: com.some.class cannot be cast to com.another.class

我猜这个问题来自于一些依赖是双重的。 com.another.class 存在于两个阴影jar 中,因此在自定义项目jar 和主项目之一中是不一样的。我有一个 Java 包,它是主项目 jar 和自定义项目 jar 的依赖项。

有人知道如何使它工作吗?有没有办法在自定义项目jar 中不包含依赖项,并明确需要将依赖项寻找到另一个jar 中?

我希望我能够让自己被理解。

谢谢!

【问题讨论】:

标签: java maven jar dependencies


【解决方案1】:

主要的一点:阴影 jar 并不意味着是其他 jar 的依赖项。

您可以构建阴影(或胖)jar 以将它们作为独立应用程序运行,但不要将它们放入 <dependencies>

如果您需要多个项目中的类,请将它们放入一个项目或模块中,然后像往常一样编译它们 jar(不是带阴影的)。然后你就可以把它当成依赖了。

【讨论】:

  • 我可以使用 jar 中的类作为另一个 jar 中的类的依赖项;就是你说的?
  • 我是说在多个项目中使用的所有类都应该放在 not 阴影的 jar 中。不要将带阴影的罐子放入<dependencies> 部分。
  • 我明白了;谢谢你的建议。但是有没有办法使用自定义 jar 作为另一个依赖项?
  • 什么是“自定义”罐子?
  • 我创建了一个接口,用户可以实现该接口并从中创建一个 jar。这个“自定义”jar 是程序的依赖项。因此,将自定义 jar 作为另一个 jar 的依赖项。
【解决方案2】:

您可以排除依赖项中的子依赖项:

<dependency>
  <groupId>my.group</groupId>
  <artifactId>my-artifact</artifactId>
  <version>1.2.3</version>
  <exclusions>
    <exclusion>
      <artifactId>xercesImpl</artifactId>
      <groupId>xerces</groupId>
    </exclusion>
    <exclusion>
      <artifactId>xmlParserAPIs</artifactId>
      <groupId>xerces</groupId>
    </exclusion>
  </exclusions>
</dependency>

【讨论】:

  • 感谢您的回答。我有一个 Java 包,它是主项目 jar 和自定义项目 jar 的依赖项。因此,我认为排除依赖项不会解决问题,因为这两个 jar 需要依赖项。
【解决方案3】:

另一种方法是选择将哪些工件放入阴影罐中。 因此,您可以包含一个组,但某些特定工件除外。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <createSourcesJar>true</createSourcesJar>
        <minimizeJar>false</minimizeJar>
        <artifactSet>
            <includes>
                <include>org.vaadin.*:*</include>
                <include>com.vaadin:*</include>
                <include>com.vaadin.external.atmosphere:*</include>
                <include>com.vaadin.external.slf4j:*</include>
                <include>com.github.*:*</include>
                <include>fi.jasoft:dragdroplayouts</include>
            </includes>
            <excludes>
                <exclude>com.vaadin:vaadin-client-compiler</exclude>
                <exclude>com.vaadin:vaadin-client</exclude>
                <exclude>com.vaadin:vaadin-theme-compiler</exclude>
            </excludes>
        </artifactSet>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多