我们有一个很奇怪的要求。
具有多个项目的Spring Boot
xbean是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。
答案 0 :(得分:0)
这看起来像是经典的类加载器自定义问题。我不会走那条路。最好的建议是
答案 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>