【问题标题】:Wildfly ignores included libraryWildfly 忽略包含的库
【发布时间】:2019-01-20 08:54:48
【问题描述】:

我在 WEB-INF/lib 文件夹中有所有库,但是在执行时, Wildfly 抱怨缺少方法:

2018-08-13 09:56:14,723 ERROR [stderr] (Thread-174) Exception in thread "Thread-174" java.lang.NoSuchMethodError: com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;
2018-08-13 09:56:14,723 ERROR [stderr] (Thread-174)     at org.reflections.Reflections.expandSuperTypes(Reflections.java:380)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at org.reflections.Reflections.<init>(Reflections.java:126)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at org.nd4j.linalg.api.ops.factory.DefaultOpFactory.<init>(DefaultOpFactory.java:71)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at java.lang.Class.newInstance(Class.java:442)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at org.nd4j.linalg.factory.Nd4j.initWithBackend(Nd4j.java:6192)
2018-08-13 09:56:14,724 ERROR [stderr] (Thread-174)     at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:6087)
2018-08-13 09:56:14,725 ERROR [stderr] (Thread-174)     at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:201)

我在运行时检查了类路径条目,结果发现 Guava 20.0.0 丢失了。但是,Guava 库包含在 lib 文件夹中,并且还指定为 Maven 依赖项。

对我不知道的库有什么特殊处理吗?谢谢!

【问题讨论】:

  • 我们可以看看你的 pom.xml 的相关部分吗?如果它是一个依赖项并且你在 pom.xml 中的 packagingwar 它应该被包含进来。
  • @stdunbar 感谢您的回复。正如我所说,Guava-jar 文件存在于 WEB-INF/lib 文件夹中,但在开始部署时并没有被 Wildfly 加载到类路径中。
  • 您的类路径中有多个版本的 Guava。重复的 JAR 来自 Weld 本身。您需要在 Weld 发行版中降级到相同版本并将其标记为已提供(不要捆绑它)或排除它developer.jboss.org/thread/196551

标签: java maven wildfly


【解决方案1】:

您必须在您的 WEB-INF 文件夹中包含一个特殊的 JBoss 文件(“jboss-deployment-structure.xml”),列出您想要忽略的所有模块(它们是 Wildfly 的默认 JEE 堆栈的一部分),这样您的 webapp 中的 guava jar 优先于 WF (%JBOSS_HOME/modules/system/layers/base/com/google/guava/main)

例子:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>                
            <module name="com.google.guava"/>           
        </exclusions>   
    </deployment>
</jboss-deployment-structure>

【讨论】:

  • 如果 WildFly 默认情况下让 Guava 对部署可见,那么这对我来说听起来像是一个错误。
  • 谢谢,我已经尝试过了,但是运行时仍然缺少 Guava 依赖项。奇怪的是,我设置了第二个 Wildfly(与 Wildfly 版本和 Java 版本完全相同)——在这里它工作正常(有和没有 jboss-deployment-structure.xml 文件——显然没关系??)
  • @Pii 你找到根本原因了吗?我正在为同样的事情而苦苦挣扎。当我将它部署在“本地”而不是在我的服务器上时,它可以工作,尽管战争是完全相同的。有环境变量要改吗?
【解决方案2】:

如果您使用的是 WL,请阅读此答案。

我在 weblogic 上部署的 web 应用程序也遇到了类似的问题。

您的库与应用服务器上已存在的标准库之间存在冲突。

在 WEB-INF 文件夹中添加这个 weblogic.xml:

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
        <wls:weblogic-version><my_wl_version</wls:weblogic-version>
        <wls:context-root>my_app</wls:context-root>
        <wls:container-descriptor>
            <wls:prefer-application-packages>
                <wls:package-name>com.google.*</wls:package-name>
            </wls:prefer-application-packages>
        </wls:container-descriptor>
    </wls:weblogic-web-app>

【讨论】:

  • 你说的WL是什么意思?
  • @Pii 我的意思是 WebLogic
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2018-10-05
  • 1970-01-01
  • 2016-07-17
  • 2011-03-20
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多