Java 是8.5.5。web应用在启动期间获取NoSuchFieldError
我有一个maven web应用程序,使用WAS8.5.5 在应用程序启动时,我遇到以下错误: 原因:java.lang.NoSuchFieldError: org/apache/http/message/basiclineformter.INSTANCE 这意味着在我的类路径中存在某种JAR不匹配(httpclient和httpcore) 为了获得更多信息,我运行了以下代码:Java 是8.5.5。web应用在启动期间获取NoSuchFieldError,java,maven,dependencies,websphere,Java,Maven,Dependencies,Websphere,我有一个maven web应用程序,使用WAS8.5.5 在应用程序启动时,我遇到以下错误: 原因:java.lang.NoSuchFieldError: org/apache/http/message/basiclineformter.INSTANCE 这意味着在我的类路径中存在某种JAR不匹配(httpclient和httpcore) 为了获得更多信息,我运行了以下代码: ClassLoader classLoader = Test.class.getClassLoader(); URL r
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/basiclineformter.class
/org/apache/http/message/basiclineformter.class空启动
jar:file:/C:/RAD9.0/IBM/WebSphere/AppServer_2/plugins/com.IBM.ws.prereq.jaxrs.jar/org/apache/http/message/basiclineformter.class
开始
文件:/C:/RAD9.0/IBM/WebSphere/AppServer_2/profiles/AppSrv01/servers/server1/configuration/org.eclipse.osgi/bundles/105/1/.cp/org/apache/http/message/basiclineformter.class
很明显,它们都是在启动时加载到WAS的。我该如何阻止这种情况发生?我试图通过设置LoadParent last来更改应用程序设置中模块加载的优先级,但这完全阻止了应用程序的运行
有什么想法吗?看起来您的应用程序中有一个比应用程序服务器中的副本版本更新的库,因此您的应用程序可以看到一个混合类。正如你所注意到的,这是一件坏事 有几种方法可以解决这个问题,但最简单的方法是更改类加载器的顺序,以便在运行时之前从应用程序中加载类。您可以在管理控制台中导航到应用程序,选择classloading并选择单选按钮,标记为Classes loaded with local class loader first(parent last)
如果您这样做,您应该确保您的应用程序中不包含JavaEE包(maven构建的应用程序有时会出现这种情况)。您还可以通过使用类装入器查看器并搜索来查看问题类的装入位置。您必须首先通过单击服务器>服务器类型>WebSphere应用程序服务器>服务器名称>类加载器查看器服务来启用该服务,启用该服务并重新启动服务器 作为一个快速修复,我不必切换到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应用程序服务器>服务器名称。然后,在服务器基础设施部分,单击Java和流程管理>流程定义>Java虚拟机
然后在“类路径”下输入以下内容
使用分号分隔条目
重新启动以重新测试。Hi Alasdair。感谢您抽出时间回复!我尝试将WAS服务器上的设置设置为PARENT_LAST,这会带来其他复杂性。com.ibm.ws.exception.RuntimeWarning:com.ibm.ws.webcontainer.exception.webappnotloadedeexception:Failed to load webapp:Failed to load webapp:javax.servlet.ServletContainerInitializer:Provider org.springframework.web.SpringServletContainerInitializer不是子类OK,我有点进一步的了解。我已经将它设置为PARENT_LAST,我已经创建了一个指向我的jar的新共享库,现在发生的是我遇到了一些spring初始化问题。。。这很有趣。我对这个解决方案并不完全满意,因为我不必将jar上传到服务器并维护它们。我希望这是在应用程序级别完成的。
C:\Program Files (x86)\IBM\WebSphere\AppServer/lib/httpcore-4.3.3.jar