Jar Vaadin Flow 14,码头嵌入式和静态文件
我正在尝试创建基于Jetty 9.4.20(嵌入式)和Vaadin Flow 14.0.12的应用程序 它基于一个非常好的项目 我想用一个Jar Vaadin Flow 14,码头嵌入式和静态文件,jar,classloader,embedded-jetty,vaadin-flow,Jar,Classloader,Embedded Jetty,Vaadin Flow,我正在尝试创建基于Jetty 9.4.20(嵌入式)和Vaadin Flow 14.0.12的应用程序 它基于一个非常好的项目 我想用一个主jar打包应用程序,所有依赖项库必须位于主jar附近的文件夹“libs”中 我删除了maven汇编插件,而是使用maven依赖插件和maven jar插件。在maven dependency plugin中,我添加了get dependencies部分,其中我将目录META-INF/resources/,META-INF/services/从Vaadin F
主jar
打包应用程序,所有依赖项库必须位于主jar
附近的文件夹“libs”中
我删除了maven汇编插件
,而是使用maven依赖插件
和maven jar插件
。在maven dependency plugin
中,我添加了get dependencies
部分,其中我将目录META-INF/resources/,META-INF/services/
从Vaadin Flow libs解压到结果JAR
在这种情况下,应用程序工作正常。但若我对“获取依赖项”(GetDependencies)一节进行了注释,那个么结果包中并没有包含目录,应用程序也无法运行
它只是不能从Vaadin Flow libs中提供一些静态文件
只有当我启动带有…的打包应用程序时,才会发生此错误
$ java -jar vaadin14-embedded-jetty-1.0-SNAPSHOT.jar
。。。但从Intellij Idea可以正确启动
有一种观点认为Jetty使用了错误的类加载器,无法在jarlibs中维护对静态文件的请求 META-INF/services/文件必须从Jetty LIB进行维护 这对于Jetty使用
java.util.ServiceLoader
非常重要
如果将JAR文件的内容合并到单个JAR文件中,则称为“uber JAR”
有很多技术可以做到这一点,但是如果您使用maven汇编插件
或maven依赖插件
来构建这个“uber jar”,那么您就不会在多个jar文件中合并具有相同名称的关键文件
考虑使用maven shade plugin
及其关联的资源转换器来正确合并这些文件
ServicesResourceTransformer
是合并META-INF/services/
文件的工具,请使用它
至于静态内容,这很好,但您必须正确设置基础资源
查看您的源代码,您可以执行以下操作
final URI webRootUri=ManualJetty.class.getResource(“/webapp/”).toURI();
最终WebAppContext上下文=新的WebAppContext();
setBaseResource(Resource.newResource(webRootUri));
这在100%的情况下都无法可靠地工作(正如您在IDE vs命令行中运行时所注意到的)
Class.getResource(String)
只有在查找文件(而不是目录)时才可靠
考虑到食谱中有这方面的技巧
见:
//找出服务内容的路径
ClassLoader cl=ManualJetty.class.getClassLoader();
//我们查找一个文件,因为ClassLoader.getResource()不是
//设计用于查找目录(我们稍后解析目录)
URL f=cl.getResource(“webapp/index.html”);
如果(f==null)
{
抛出新的RuntimeException(“找不到资源目录”);
}
//将文件解析到目录
URI webRootUri=f.toURI().resolve(“./”).normalize();
System.err.println(“WebRoot是”+webRootUri);
WebAppContext=新的WebAppContext();
setBaseResource(Resource.newResource(webRootUri));
我根据Martin's repo的最新版本创建了一个插件,将maven assembly替换为shade插件。工作很好。谢谢