我有一个使用WAS 8.5.5的maven web应用程序。
在应用启动时,我收到以下错误:
引起:java.lang.NoSuchFieldError: 组织/阿帕奇/ HTTP /消息/ 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 罐子:文件:/ 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。我如何阻止这种情况发生?我尝试通过设置最后加载父项来更改应用程序设置中模块加载的优先级,但这使得应用程序完全无法启动。
有什么想法吗?
答案 0 :(得分:2)
您还可以使用Class Loader Viewer查看加载违规类的位置并进行搜索。您必须先单击服务器>启用此功能。服务器类型> 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并转到:
服务器&gt;服务器类型&gt; WebSphere应用程序服务器&gt;服务器名称。然后,在“服务器基础结构”部分中,单击“Java和进程管理”&gt; <处理定义> Java虚拟机
然后在&#34; Classpath&#34;
下输入以下内容C:\Program Files (x86)\IBM\WebSphere\AppServer/lib/httpcore-4.3.3.jar
使用分号分隔条目。
重新开始重新测试。
答案 1 :(得分:1)
您的应用程序中的库看起来比应用程序服务器中的副本更新,因此最终会出现应用程序可见的混合类。你注意到这是一件坏事。
有几种方法可以解决这个问题,但最简单的方法是更改类加载器顺序,以便在运行时之前从应用程序加载类。您可以在管理控制台中执行此操作,方法是导航到应用程序,选择类加载并选择标有首先加载本地类加载器的类的单选按钮(父级最后一个)。
如果你这样做,虽然你应该确保你没有在你的应用程序中包含Java EE包(有时会在maven构建的应用程序中发生)。