我正在尝试将executable war file部署到Web服务器(在本例中为weblogic)。我还想在其他文件夹中添加一些外部依赖项(jar文件)。最终目标是在EAR中部署骨瘦如柴的WAR
从文档中,我的spring-boot-maven-plugin看起来像这样:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
</configuration>
</plugin>
</plugins>
如果没有<layout>ZIP</layout>
,我将获得正确的软件包结构,并且可以使用java -jar Web-0.0.1-SNAPSHOT.war
进行战争,并且可以部署到Weblogic
问题是我无法使用此方法添加外部依赖项。为此,我希望使用PropertiesLauncher,但是当我添加<layout>ZIP</layout>
配置时,我的存档结构也会更改。
这没有ZIP
Web-0.0.1-SNAPSHOT.war
├───META-INF
│ └───maven
│ └───com.poc
│ └───Web
├───org
│ └───springframework
│ └───boot
│ └───loader
│ ├───archive
│ ├───data
│ ├───jar
│ └───util
└───WEB-INF
├───classes
│ └───com
│ └───poc
│ └───config
│ └───controller
├───lib
└───lib-provided
清单文件如下:
Manifest-Version: 1.0
Implementation-Title: Web
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.poc.WebApplication
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.0.RELEASE
Created-By: Maven Archiver 3.4.0
Implementation-Vendor: None
Main-Class: org.springframework.boot.loader.WarLauncher
这是ZIP选项:
Web-0.0.1-SNAPSHOT.war
├───BOOT-INF
│ ├───classes
│ │ └───WEB-INF
│ │ ├───classes
│ │ │ └───com
│ │ │ └───poc
│ │ │ └───config
│ │ │ └───controller
│ │ └───lib
│ └───lib
├───META-INF
│ └───maven
│ └───com.poc
│ └───Web
└───org
└───springframework
└───boot
└───loader
├───archive
├───data
├───jar
└───util
清单文件现在看起来像这样:
Manifest-Version: 1.0
Implementation-Title: Web
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: WEB-INF.classes.com.poc.WebApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.0.RELEASE
Created-By: Maven Archiver 3.4.0
Implementation-Vendor: None
Main-Class: org.springframework.boot.loader.PropertiesLauncher
当我现在尝试运行WAR时,出现错误:
Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/com/poc/WebApplication (wrong name: com/poc/WebApplication)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:597)
我已经尝试了以下方法,但没有任何运气:
java -Dloader.path=WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes -jar Web-0.0.1-SNAPSHOT.war
java -Dloader.path=BOOT-INF/lib,BOOT-INF/classes,WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes -jar Web-0.0.1-SNAPSHOT.war
java -Dloader.path=BOOT-INF/lib/**,BOOT-INF/classes/**,WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes -jar Web-0.0.1-SNAPSHOT.war
我也尝试指定主类,但仍然出现NoClassDefFoundError:
java -Dloader.path=BOOT-INF/lib/**,BOOT-INF/classes/**,WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes -Dloader.main=BOOT-INF.classes.WEB-INF.classes.com.poc.WebApplication -jar Web-0.0.1-SNAPSHOT.war
我也尝试使用java -cp
指定类路径,但还是没有运气...
这是插件中的错误吗?
我的目录结构看起来与文档中为executable war file
甚至可以在WAR中使用PropertiesLauncher吗?