0

为了学习 Spring,我创建了一个非常小的项目,并使用 Gradle 成功构建。然后我能够使用 .war 成功运行生成的 .war java -jar UserSettingController.war,得到 Spring 消息:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.1.0.BUILD-SNAPSHOT)

接下来,我想把它从 Tomcat 移到 Websphere Liberty。所以,天真地,我将 .war 文件从我的 project/build/libs/ 复制到适当的dropins文件夹,然后启动 Liberty 服务器。那时,我在 Libertyconsole.log中看到的不是Spring标志,而是以下内容:

[WARNING ] CWWKC0044W: An exception occurred while scanning class and annotation data. The exception was java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at [internal classes]
.
[WARNING ] CWWKC0044W: An exception occurred while scanning class and annotation data. The exception was java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at [internal classes]
.
[WARNING ] CWWKC0044W: An exception occurred while scanning class and annotation data. The exception was java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at [internal classes]
.
[AUDIT   ] CWWKT0016I: Web application available (default_host): http://ui15-lin.utopusinsights.com:9080/UserSettingController/
[AUDIT   ] CWWKZ0001I: Application UserSettingController started in 4.829 seconds.
[AUDIT   ] CWWKF0012I: The server installed the following features: [jsp-2.2, servlet-3.1, ssl-1.0, jndi-1.0, websocket-1.0, json-1.0, localConnector-1.0, adminCenter-1.0, distributedMap-1.0, jaxrs-1.1, restConnector-1.0].
[AUDIT   ] CWWKF0011I: The server defaultServer is ready to run a smarter planet.

我的问题是:这些[Warning]重要吗?如果是这样,有什么问题?或者应用程序实际上是否通过 Web 服务器进行侦听,如果是,它正在侦听哪个端口(8080?)?

4

1 回答 1

1

很可能,该应用程序包含了一个具有 java9 功能的 jar 文件。

最简单的是,有一个普通类已编译为 java9。

更有可能的是,应用程序已经拉入了一个实用程序 jar,例如 log4j,它有一个“module-info”类,或者包含一个多版本目录(目前,只有“META-INF/versions/9”是可能的) .

(请参阅https://www.javaworld.com/article/3184029/java-language/java-9s-other-new-enhancements-part-4-multi-release-jar-files.html,了解有关多释放罐子。)

“module-info”类文件将始终编译为 java9 或更高版本。多版本目录中的类将被编译为作为目录名称提供的 java 版本。

在所有情况下,如果类使用 ASM 进行注释处理,则会发生 IllegalArgumentException。(尝试加载类也会导致异常。)

出现问题的部分原因是当前的 WebSphere Liberty 注释处理使用简单的测试来发现“类类型”资源,该测试是测试类资源名称(文件或 jar 条目)是否以“.class”结尾。在引入 module-info 类型类之前和在 META-INF 文件夹下放置类之前,这个测试就足够了。

作为更新,正在进行代码更改,这将阻止处理问题类(“module-info”类或“META-INF”下的任何类)。有关更多信息,请参阅开放自由问题 1635:https ://github.com/OpenLiberty/open-liberty/issues/1635 。

关于解决问题的项目更新:我最好的感觉是,该项目更新会影响将哪些 jar 放入应用程序,结果是不再放入具有 java9 功能的 jar。

于 2018-04-25T20:29:22.007 回答