嵌入式Jetty无法访问Spring Boot uber-jar中的jar中的静态Web内容

时间:2014-05-01 08:10:13

标签: neo4j embedded-jetty spring-boot uberjar

我正在运行一个带有底层Neo4j数据库的Spring Boot网络应用程序。为了能够查看Neo4j浏览器(直接将Web视图导入数据库),使用以下配置将Neo4j Web服务器嵌入到应用程序中。

@Bean(initMethod = "start", destroyMethod = "stop")
public WrappingNeoServerBootstrapper neo4jWebServer() {
    return new WrappingNeoServerBootstrapper((GraphDatabaseAPI) graphDatabaseService());
}

并在maven pom中加入以下内容:

<dependency>
    <groupId>org.neo4j.app</groupId>
    <artifactId>neo4j-server</artifactId>
    <classifier>static-web</classifier>
    <version>2.0.2</version>
</dependency>

从STS(即未打包)运行时,一切正常。

当我使用spring-boot-maven-plugin打包应用程序时。这会在uber-jar的/ lib文件夹中正确创建包含neo4j-server-2.0.2-static-web.jar文件的超级jar。

当我使用uber-jar文件直接运行应用程序然后尝试点击Neo4j浏览器的http://localhost:7474/browser/ URL时,它会返回404.

原因是Jetty DefaultServlet尝试从getResource() WebAppContext尝试JarFileResource.exists()jar:file:/home/dev/myapp/target/myapp-0.0.1-SNAPSHOT.jar!/lib/neo4j-browser-2.0.2.jar!/browser/ 会调用/lib/neo4j-browser-2.0.2.jar!/browser/来尝试对以下网址字符串进行操作:

!/

Jetty无法匹配其资源列表中的任何内容,因为它正在寻找名为String.lastIndexOf("!/")的资源作为代码,例如在http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-util/src/main/java/org/eclipse/jetty/util/resource/JarFileResource.java#n123(以及其他几个地方)正在寻找字符串中的第一个{{1}}。

我将为此提交一个Jetty错误,并建议他们在代码中使用{{1}},以解决问题。

与此同时,除了制作我们的标准maven组件之外,有没有人对如何在Spring Boot uber-jar中使用它有任何建议?

非常感谢。

2 个答案:

答案 0 :(得分:1)

Spring Boot uber-jars使用一些特殊技术来允许从嵌套jar加载内容。 Jetty(完全可以理解)假设jar URL只包含一个!,但遗憾的是这不是这里的。

您最简单的解决方案可能是切换到maven-shade-plugin。这会通过解压缩所有依赖项来创建一个超级jar,然后再将它们重新打包到一个jar中。

Spring Boot reference documentation

中建议了其他一些替代方案

答案 1 :(得分:0)

如果你正在使用SpringBoot + Maven,你可以添加以下内容:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <requiresUnpack>
            <dependency>
                <groupId>org.neo4j.app</groupId>
                <artifactId>neo4j-browser</artifactId>
            </dependency>
        </requiresUnpack>
    </configuration>
    <executions>
       ...
</plugin>

this gradle suggestion获得