shadowJar不包括依赖jar,而是包括我的Helidon Gradle项目中的类



我有一个Helidon MP项目,按照这里提供的步骤构建一个fat jar

https://blogs.oracle.com/developers/post/migrating-a-helidon-se-application-to-gradle

gradlew shadowJar构建成功,所有依赖提取为类,而不是包括依赖jar。因此,我得到了以下异常:

线程"main"org.jboss.weld.exceptions.IllegalArgumentException: WELD-001325:没有在部署中注册的扩展类io.helidon.microprofile.server.ServerCdiExtension实例org.jboss.weld.manager.BeanManagerImpl.getExtension (BeanManagerImpl.java: 1445)org.jboss.weld.util.ForwardingBeanManager.getExtension (ForwardingBeanManager.java: 239)io.helidon.microprofile.server.Server Builder美元。(Server.java: 154)io.helidon.microprofile.server.Server.builder (Server.java: 91)在com.ananth.osef.Main.startServer (Main.java: 28)com.ananth.osef.Main.main (Main.java: 23)

如何构建包含单个jar而不是提取类的影子jar ?

我使用gradle 5.6.3和shadow 5.2.0

扩展定义在META-INF/services/...下的文件中。阴影(或阴影)时的问题是,这些文件存在于不同的工件中,但最终jar中只有一个。要解决这个问题,你必须合并文件。

幸运的是,有一个方便的Gradle ShadowTransformer就是这样做的:https://imperceptiblethoughts.com/shadow/configuration/merging/#merging-service-descriptor-files

shadowJar {
mergeServiceFiles()
}

我在使用Maven Shade时遇到了同样的问题插件并使用了这个资源转换器:https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#ServicesResourceTransformer

<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>

我不太了解Gradle,也不了解shadow,但是制作一个fat jar通常是一个糟糕的方法,因为,正如你所发现的,有意义的资源文件可能被合并、覆盖或省略(就像上面发生的META-INF/beans.xml资源一样),无论你使用哪种构建工具。

如果你的Helidon SE程序是为Docker和/或Kubernetes设计的,你最好遵循Helidon快速入门示例中的部署策略,它利用了容器层,不会遇到你上面提到的问题。

如果这是一个shadow问题("我如何使用shadow来制作一个胖罐?")我让更有资格的人来回答。

最新更新