在尝试在WebSphere 8.5.5.13上部署ear包时出现了AnnotationException异常吗?

IT小君   2023-09-16T19:52:35

在spring 4.13上有一个应用程序 因此,尝试在websphere 8.5.5.13上部署ear文件时会出现错误消息

[12/18/18 14:56:41:946 MSK] 00000086 AnnotationCon E CWMDF0002E: 注解处理失败,出现以下错误: com.ibm.ws.metadata.annotations.AnnotationException: 注解处理失败的类: META-INF/versions/9/javax/xml/bind/ModuleUtil.class

这是什么问题? 可能是安装错误或应用程序和服务器库不兼容的错误?

应用程序有入口点

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"spring"})
public class WebAppInitalizer implements WebApplicationInitializer {
    private static final String CONFIG_LOCATION = "spring.config";
    private static final String MAPPING_URL = "/*";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>> ONSTARTUP <<<<<<<<<<<<<<<<<<<<<<<<");
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping(MAPPING_URL);
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>> ONSTARTUP END <<<<<<<<<<<<<<<<<<<<<<<<");
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation(CONFIG_LOCATION);
        return context;
    }
}

配置文件是

package spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "spring")
public class AppConfig {
}


   package spring.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
}

测试控制器是:

package spring.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping(value = "/greeting")
    public String healthCheck() {
        return "greeting";
    }

}
评论(3)
IT小君

错误信息抱怨一个位于META-INF/versions/9目录下的类。该位置表明您有一个包含Java V9类的多版本JAR文件。 WAS不支持Java V9类,但已经添加了代码以容忍它们存在于多版本JAR文件中。

多版本JAR文件直到WAS 8.5.5和WAS 9.0发布之后才存在。为了解决在应用程序中添加多版本JAR文件时发现的问题,为WAS 8.5.5创建了五个APAR。以下是APAR的列表。请注意,3个APAR已包含在8.5.5.14中,另外2个在8.5.5.15中。您可能不需要全部,这取决于您的应用程序,而且在某些情况下还取决于应用程序类的扫描顺序。

WAS V9还有第六个APAR,只用于性能。它不适用于WAS 8.5.5。

底线是:要完全容忍多版本JAR文件,您需要升级到8.5.5.15或9.0.0.10或应用以下所有APAR。

  1. PI89708 – 8.5.5.14,9.0.0.7
  2. PI93744 – 8.5.5.14,9.0.0.8
  3. PI96826 – 8.5.5.14,9.0.0.8
  4. PH02014 – 8.5.5.15,9.0.0.10
  5. PH03710 – 8.5.5.15,9.0.0.10
  6. PI98450 - N/A,9.0.0.9
2023-09-16T19:52:57   回复
IT小君

您需要在下一个修补程序中使用PI96826

https://www-01.ibm.com/support/docview.wss?uid=swg1PI96826

Java V9多版本JAR包在META-INF目录树下包含了Java V9类。存在Java V9类会导致应用程序启动失败,出现类似下面的异常:

2023-09-16T19:53:03   回复
IT小君

另外,一个(临时的)解决方法是使用归档或包过滤,该方法在应用部署期间减少注释搜索中有描述,以排除某些库或类的扫描。

该产品提供了可配置的过滤功能,以减少搜索注释的类数量。您可以通过四个属性(或清单属性)来标识要忽略的模块或Java包,用于注释处理:

Ignore-Scanning-Archives
Ignore-Scanning-Packages
Include-Scanning-Archives
Include-Scanning-Packages

这些属性可以在app_server_root/properties的amm.filter.properties中指定,也可以作为清单属性指定。您还可以使用以下系统属性来标识要忽略的模块或Java包:

com.ibm.ws.amm.scan.context.filter.archives
com.ibm.ws.amm.scan.context.filter.packages
com.ibm.ws.amm.scan.context.include.archives
com.ibm.ws.amm.scan.context.include.packages

使用这些选项来限制扫描注释的类。

我最近自己使用了amm.filter.properties版本,等待应用适当的WebSphere修补程序,这样我们就可以绕过我们目前的问题。

在我们的情况下,是Jackson 2.10库发出了警告,所以我将以上文件的WebSphere根属性版本复制到了我的profile/properties目录,并将Jackson的jar包添加到了Ignore-Scanning-Archives部分。

此外,似乎我还需要重新启动我们的WebSphere ND节点代理并重新部署应用程序ear/war,以解决最初的问题。

2023-09-16T19:53:25   回复