我正在实现一个war文件,它应该支持以两种不同的方式执行:
- 内部 Servlet 容器 - 通过将其部署在 Tomcat 或 Jetty 中。
- Servlet 容器外部 - 从命令提示符执行它,而不使用任何嵌入式 servlet 容器。这需要作为 war 文件的一部分得到支持。
我发现 Spring Boot Loader 组件与实现 #2 更相关。在将其与 Maven 集成之前,我尝试手动使用它。我按照本文档中提到的“WAR 文件结构”部分进行了操作。请参阅“WAR 文件结构”部分。
我按照以下步骤操作。我创建了战争文件。我解压了它,然后在它的根目录下添加了所有的 spring boot loader 类文件。我在清单文件中添加了适当的条目以使 war 可执行。然后将其压缩并重命名回原始战争文件。当我使用命令 - Java -jar mywar.war 执行它时,它失败并出现以下异常:
java.lang.IllegalStateException: Unable to open nested compressed entry WEB-INF/lib/spring-core-3.1.2.RELEASE.jar
at org.springframework.boot.loader.jar.JarFile.getNestedJarFileFromFileEntry(JarFile.java:330)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:305)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:87)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:74)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:78)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:52)
at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:79)
它不仅针对特定的 jar,而且针对所有 jar 文件都给出错误。我想,当我使用 Maven 自动执行上述步骤时,它也会失败。
谢谢。