Spring Boot Maven在多模块项目中使用具有不同版本的同一jar

时间:2019-04-10 13:19:03

标签: java spring maven spring-boot

我们有一个很奇怪的要求。

具有多个项目的Spring Boot

xbean是xmlbeans apache jar的旧版本

我们要同时使用

  1. xbean旧罐,在同一罐中进行了一些自定义更改
  2. 最新的xmlbeans Apache jar

我们当前的实现为

Main()-

|-XLSImportProject项目-需要最新的jar才能读取xlsx文件

|-B项目-需要旧的jar进行自定义操作

|-C项目-还需要旧的jar进行自定义操作

如果我们将 xbean old jar 赋予maven优先级,则将获得

的异常
org.apache.poi.ooxml.POIXMLException: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
    at org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:66)
    at org.apache.poi.ooxml.POIXMLDocumentPart.read(POIXMLDocumentPart.java:648)
    at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:180)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:286)
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:83)
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.poi.ss.usermodel.WorkbookFactory.createWorkbook(WorkbookFactory.java:314)
    at org.apache.poi.ss.usermodel.WorkbookFactory.createXSSFWorkbook(WorkbookFactory.java:296)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:214)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:180)

如果我们给maven 优先于最新的xmlbeans ,则将出现以下错误:

Exception in thread "Thread-14" java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlObject.getParent()Lorg/apache/xmlbeans/XmlObject;

我们必须在子项目中使用旧的xbean jar,在其他项目中使用最新的xmlbeans jar。

但是Spring总是会在依赖项中首先定义jar。

2 个答案:

答案 0 :(得分:0)

这看起来像是经典的类加载器自定义问题。我不会走那条路。最好的建议是

  1. 创建具有所有依赖项的自己的jar(因为您将面临向后兼容性的问题,所以很麻烦)。看一下here重新包装罐子。
  2. 使用一个特定的依赖项将多模块项目分解为不同的项目,每组项目都必须如此。

答案 1 :(得分:0)

看看Maven shade plugin。如果需要,它将根据jar的内容重命名软件包。使用Uber jar为您的主应用程序创建shade plugin

阴影插件配置:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <!-- put your configurations here -->
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>