Spring Boot 2.2 ClassNotFoundException com.sun.xml.ws.spi.ProviderImpl 使用 fat jar 从 Java 8 升级到 11
Spring Boot 2.2 ClassNotFoundException com.sun.xml.ws.spi.ProviderImpl upgrading from Java 8 to 11 using fat jar
我正在从 Java 8 升级到 Java 11。
我正在使用 javax.ws 包,所以我必须包含在 Java 11 中删除的依赖项。
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3-b01</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.3-b01</version>
</dependency>
我的 Spring Boot 2.2.2 应用程序与 mvn spring-boot:run
一样完美 运行。
当 运行 java -jar app.jar 在搜索 com.sun.xml.ws.spi.ProviderImpl
时给出 ClassNotFoundException
我检查了 rt-version.jar 在最后的 fat jar.
并检查了 class 在罐子里。
当 运行 处于 java -jar
模式时,spring 是否从 ClassLoader 中删除 classes?
真正的问题是从 Java9 开始的行为发生了变化。
ForkJoinPools 现在没有主线程类加载器,它们有系统类加载器。
但是 Java11 允许在 ForkJoinPool 构造函数中使用更多参数,因此我们可以使用所需的类加载器创建自己的池。
该解决方案发布在另一个答案中。
我正在从 Java 8 升级到 Java 11。
我正在使用 javax.ws 包,所以我必须包含在 Java 11 中删除的依赖项。
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3-b01</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.3-b01</version>
</dependency>
我的 Spring Boot 2.2.2 应用程序与 mvn spring-boot:run
一样完美 运行。
当 运行 java -jar app.jar 在搜索 com.sun.xml.ws.spi.ProviderImpl
时给出 ClassNotFoundException
我检查了 rt-version.jar 在最后的 fat jar.
并检查了 class 在罐子里。
当 运行 处于 java -jar
模式时,spring 是否从 ClassLoader 中删除 classes?
真正的问题是从 Java9 开始的行为发生了变化。
ForkJoinPools 现在没有主线程类加载器,它们有系统类加载器。
但是 Java11 允许在 ForkJoinPool 构造函数中使用更多参数,因此我们可以使用所需的类加载器创建自己的池。
该解决方案发布在另一个答案中。