1

我有一个 Helidon MP 项目并按照此处提供的步骤构建一个胖罐

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

gradlew shadowJar 成功构建,所有依赖项都作为类提取,而不是按原样包含依赖 jar。因此,我收到以下异常。

线程“主”org.jboss.weld.exceptions.IllegalArgumentException 中的异常:WELD-001325:没有在 org.jboss.weld.manager.BeanManagerImpl 的部署中注册扩展类 io.helidon.microprofile.server.ServerCdiExtension 的实例。 getExtension(BeanManagerImpl.java:1445) at org.jboss.weld.util.ForwardingBeanManager.getExtension(ForwardingBeanManager.java:239) at io.helidon.microprofile.server.Server$Builder.(Server.java:154) at 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

4

2 回答 2

0

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

幸运的是,有一个方便的Gradle Shadow转换器可以做到这一点: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>
于 2022-01-03T07:28:31.237 回答
0

我不太了解 Gradle,也不了解影子,但是制作一个胖 jar 通常是一种不好的方法,因为正如您所发现的那样,有意义定位的资源文件可能会被合并、覆盖或省略(这可能正在发生)上面有META-INF/beans.xml资源),无论您使用的是哪种构建工具。

如果您的 Helidon SE 程序用于 Docker 和/或 Kubernetes,则最好遵循Helidon 的快速入门示例之一中的部署策略,该策略利用容器层并且不会遇到您引用的问题以上。

如果这是一个shadow问题(“我如何用它shadow来制作一罐肥罐?”)我会让更有资格的人回答这个问题。

于 2021-10-26T18:53:54.867 回答