0

我正在实现一个war文件,它应该支持以两种不同的方式执行:

  1. 内部 Servlet 容器 - 通过将其部署在 Tomcat 或 Jetty 中。
  2. 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 自动执行上述步骤时,它也会失败。

谢谢。

4

1 回答 1

1

底层 ZIP 文件格式存在一些限制,使得WarLauncher(和朋友)无法从嵌套压缩档案中加载资源。但是,您正在构建您的 WAR 文件,您需要重新执行该步骤并确保嵌套的 JAR 未被压缩。然后它应该工作。(如果你对 Maven WAR 构建使用默认设置,它也可以工作。)

于 2013-11-27T10:12:48.967 回答