当前位置: 代码迷 >> java >> 是8.5.5。 Web应用程序在启动期间获取NoSuchFieldError
  详细解决方案

是8.5.5。 Web应用程序在启动期间获取NoSuchFieldError

热度:98   发布时间:2023-07-17 21:00:07.0

我有一个使用WAS 8.5.5的maven web应用程序。

在应用程序启动时,我收到以下错误:

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

这意味着我的类路径中存在某种不匹配的jar(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 null start jar:file:/ C:/RAD9.0/IBM/WebSphere/AppServer_2/plugins /com.ibm.ws.prereq.jaxrs.jar!/org/apache/http/message/BasicLineFormatter.class start file:/ C:/RAD9.0/IBM/WebSphere/AppServer_2/profiles/AppSrv01/servers/server1/配置/ org.eclipse.osgi /捆绑/ 10/1 / .cp /组织/阿帕奇/ HTTP /消息/ BasicLineFormatter.class

这些都在启动时明显加载到WAS。 我如何阻止这种情况发生? 我尝试通过设置最后加载父项来更改应用程序设置中模块加载的优先级,但这使应用程序停止运行。

有任何想法吗?

您还可以使用类加载器查看器查看加载违规类的位置并进行搜索。 您必须首先通过单击服务器>服务器类型> 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类路径中添加了一个条目:

打开并转到:

服务器>服务器类型> WebSphere应用程序服务器> server_name。 然后,在“服务器基础结构”部分中,单击“Java和进程管理”>“进程定义”>“Java虚拟机”

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

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

使用分号分隔条目。

重新开始重新测试。

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

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

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

  相关解决方案