我有一个大项目,它由几个较小的项目组成,每个项目都有一个pom.xml
。一些项目是其他项目的依赖项。我的工作方式是通过maven生成一些独立的阴影jar
和war
文件。
我遇到的问题是我有一个新的自定义项目,该项目依赖于主项目中的类。问题在于该项目包含一个自定义类,因此,生成的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
中?
我希望我能够使自己理解。
谢谢!
答案 0 :(得分:1)
最主要的是:阴影jar并不意味着是其他jar的依赖项。
您可以构建有阴影的(或胖的)罐子以将其作为独立的应用程序运行,但不要将其放入<dependencies>
中。
如果您需要在多个项目中使用类,请将它们放入项目或模块中,然后像平常的jar一样编译它们(而不是阴影对象)。然后,您可以将其用作依赖项。
答案 1 :(得分:0)
您可以在依赖项中排除子依赖项:
<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>
答案 2 :(得分:0)
另一种方法是选择将哪些工件放入您的阴影罐中。 因此,除了一些特定的工件外,您还可以包括一个组。
<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>