Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jar Vaadin Flow 14,码头嵌入式和静态文件_Jar_Classloader_Embedded Jetty_Vaadin Flow - Fatal编程技术网

Jar Vaadin Flow 14,码头嵌入式和静态文件

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

我正在尝试创建基于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 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插件。工作很好。谢谢