【问题标题】:WAS 8.5.5. web app getting NoSuchFieldError during startup是 8.5.5。 Web 应用程序在启动期间收到 NoSuchFieldError
【发布时间】:2015-07-30 23:21:47
【问题描述】:

我有一个使用 WAS 8.5.5 的 Maven 网络应用程序。

应用启动时出现以下错误:

引起:java.lang.NoSuchFieldError: org/apache/http/message/BasicLineFormatter.INSTANCE

这意味着我的类路径中存在某种不匹配的 jars(httpclient 和 httpcore)。

为了获取更多信息,我运行了以下代码:

ClassLoader classLoader = Test.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
log.info("Outputting resoure info: " + resource.getFile() + " " + resource.getPath() + " " + resource.getRef());
          try {
                 log.info(FileLocator.resolve(resource));
                 log.info(FileLocator.toFileURL(resource));
          } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          }

这给了我以下输出:

开始输出资源信息: /org/apache/http/message/BasicLineFormatter.class /org/apache/http/message/BasicLineFormatter.class 空开始 jar:file:/C:/RAD9.0/IBM/WebSphere/AppServer_2/plugins/com.ibm.ws.prereq.jaxrs.jar!/org/apache/http/message/BasicLineFormatter.class 开始 文件:/C:/RAD9.0/IBM/WebSphere/AppServer_2/profiles/AppSrv01/servers/server1/configuration/org.eclipse.osgi/bundles/105/1/.cp/org/apache/http/message/BasicLineFormatter .class

这些显然都是在启动时加载到 WAS 的。我该如何阻止这种情况发生?我尝试通过最后设置加载父级来更改应用程序设置中模块加载的优先级,但这完全阻止了应用程序的出现。

有什么想法吗?

【问题讨论】:

    标签: java maven dependencies websphere


    【解决方案1】:

    您还可以使用类加载器查看器查看违规类的加载位置并进行搜索。您必须首先通过单击服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name > 类加载器查看器服务来启用此功能,启用该服务并重新启动服务器。

    作为一种快速修复,无需切换到 PARENT_LAST 并创建共享库,我将 JAR 文件从我的 .m2/repo 文件夹复制到 AppServ/lib 目录。

    > cp C:\path\to\your\.m2\repository\org\apache\httpcomponents\httpcore\4.3.3\httpcore-4.3.3.jar "C:\Program Files (x86)\IBM\WebSphere\AppServer\lib"  
    

    然后我在服务器控制台的 JVM 类路径中添加了一个条目:

    打开https://localhost:9043/ibm/console 并转到:

    服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name。然后,在 Server Infrastructure 部分中,单击 Java and process management > Process definition > Java virtual machine

    然后在“Classpath”下输入以下内容

    C:\Program Files (x86)\IBM\WebSphere\AppServer/lib/httpcore-4.3.3.jar
    

    使用分号分隔条目。

    重启重新测试。

    【讨论】:

      【解决方案2】:

      看起来您的应用程序中的库版本比应用程序服务器中的副本更新,因此您最终会得到应用程序可见的混合类。如您所见,这是一件坏事。

      有几种方法可以解决这个问题,但最简单的方法是更改​​类加载器顺序,以便在运行时之前从应用程序加载类。您可以在管理控制台中执行此操作,方法是导航到应用程序,选择类加载并选择标记为首先加载本地类加载器的类(最后一个父类)的单选按钮。

      如果你这样做,你应该确保你没有在你的应用程序中包含 Java EE 包(这有时会发生在 maven 构建的应用程序中)。

      【讨论】:

      • 嗨阿拉斯代尔。感谢您抽出时间回复!我尝试将 WAS 服务器上的设置设置为 PARENT_LAST,这会带来其他复杂性。 com.ibm.ws.exception.RuntimeWarning:com.ibm.ws.webcontainer.exception.WebAppNotLoadedException:无法加载 webapp:无法加载 webapp:javax.servlet.ServletContainerInitializer:提供程序 org.springframework.web.SpringServletContainerInitializer 不是子类型
      • 好的,我更进一步了。我已经将它设置为 PARENT_LAST,我已经创建了一个指向我的 jar 的新共享库,现在发生的事情是我遇到了一些 spring 初始化问题......这很有趣。我对这个解决方案并不完全满意,因为我不必将 jar 上传到服务器并维护它们。我宁愿那是在应用程序级别完成的。
      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多