我正在运行一个带有底层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中使用它有任何建议?
非常感谢。
答案 0 :(得分:1)
Spring Boot uber-jars使用一些特殊技术来允许从嵌套jar加载内容。 Jetty(完全可以理解)假设jar URL只包含一个!
,但遗憾的是这不是这里的。
您最简单的解决方案可能是切换到maven-shade-plugin。这会通过解压缩所有依赖项来创建一个超级jar,然后再将它们重新打包到一个jar中。
中建议了其他一些替代方案答案 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>