【问题标题】:Deploy Spring Boot to weblogic 12将 Spring Boot 部署到 weblogic 12
【发布时间】:2018-01-31 22:01:36
【问题描述】:

我使用 start.spring.io 创建了一个应用程序(spring boot 1.5.6)并尝试将其部署到 Weblogic 12.1.3.0.0。
管理控制台中的消息:

错误无法访问选定的应用程序。
错误 java.io.IOException
错误 weblogic.utils.compiler.ToolFailureException

日志中的消息:
<23.08.2017 13:40:26 GMT+03:00> <Error> <J2EE> <BEA-160228> <AppMerge failed to merge your application. If you are running AppMerge on the command-line, merge again with the -verbose option for more details. See the error message(s) below.>

这些链接没有帮助:
https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/howto-traditional-deployment.html
Deploy Spring Boot app in Weblogic

更新:
问题是依赖 JAX-RS。没有它,应用程序将成功部署。不确定如何使用此依赖项
更新 x2:
删除了 Jax-rs,现在:
java.lang.NoSuchMethodError:org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
Resolved by this

【问题讨论】:

  • Weblogic 提供 jax-rs 作为库。如果您在应用程序的类路径上也有 jar-rs,则这两个版本可能存在一些冲突。看到这个:docs.oracle.com/cd/E24329_01/web.1211/e21049/… - “prefer-application-packages”部分
  • 目前还不清楚提供的链接中解决了什么以及如何解决。可能是从那里编辑了一些东西。我唯一理解的是部署的库中存在冲突-WAR内部的库和服务器上提供的库。在我的情况下,有 slf4j 和 log4j 依赖项在 WLS 读​​取 WAR 期间以某种方式导致问题 - 我尝试通过管理员控制台进行部署,选择由 maven WAR 插件生成的 WAR。在我删除日志库后,WAR 部署正常。顺便说一句,我对 WLS 12.2.1 没有这个问题

标签: java spring-boot weblogic12c


【解决方案1】:

我们的团队开始使用 Spring Boot 2.0.0,我们也遇到了这个问题。

经过一番调查,我们发现 AppMerge 工具会在部署前扫描所有类。

根本原因:

  • 如果是 WebLogic 12.1.3.*,它会因为Multi-Release JAR Files 而失败。
  • AppMerge 工具无法处理 JDK 9 文件。

解决办法:

  • 使用 Log4j 2.8.2

pom.xml 中:

<?xml version="1.0" encoding="UTF-8"?>
<project>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.0.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   ...
   <properties>
      ...
      <log4j2.version>2.8.2</log4j2.version>
      ...
   </properties>
   ...
</project>

【讨论】:

  • 你的分析是正确的!删除 log4j2 多版本 jar 后,weblogic 部署完美无缺!为了使用最新的 log4j2 jar 而不是像 2.8.2 这样的旧版本,有什么解决方案可以解决这个问题?
【解决方案2】:

我遇到了这个问题,Artyom 的回答是正确的,但我会提供一个答案以提供更多细节。

我的问题是龙目岛。 1.6.20 之后的任何版本(我相信)都添加了 Java 9 模块支持。这会在 .jar 文件的根目录中添加一个 module-info.class。我通过从 jar 中删除 module-info.class 文件并重建我的战争来确认这是问题所在。 Appmerge 能够在删除此文件后成功运行。我不建议在生产中这样做,我只是为了确认问题。不知道为什么 Appmerge 不喜欢 module-info.class 文件。

一些可以帮助您解决此问题的建议:

  • 识别有问题的依赖项的一种简单方法是获取一个已知的有效项目,然后从失败的项目中添加依赖项,直到好的项目失败。

  • 提取损坏的依赖项的 jar 文件并在根目录中查找 module-info.class 文件。如果它在那里,这可能就是问题所在。

  • 测试 .war 是否合并的有用命令:java -cp c:\path_to_weblogic_server\wlserver\server\lib\weblogic.jar weblogic.appmerge -verbose target/your_war_file.war。这将节省您尝试在控制台中进行部署的时间。

至于除了恢复到旧版本之外的解决依赖关系的解决方案,我还在想办法。

注意:在 Lombok 的情况下,我相信您应该将范围设置为提供,而在我的情况下我没有这样做。提供范围时不会包含 .jar,因此您不会遇到此问题。请参阅此answer 了解更多信息。

【讨论】:

    【解决方案3】:

    Spring boot 2.0 依赖于 JPA 2.1,而 Weblogic 12.1.3 vanilla 安装依赖于 JPA 1.0。

    请注意,Weblogc 12.1.3 有点特殊,它分为两个 Java 企业规范 6 和 7。

    1. 您需要升级您的 JPA api 并将 hibernate 5 实现添加到您的 weblogic 12.1.3 实例中。

    2. 在您的 Web 应用程序中,确保您拥有哪些依赖项,并且它们不会与 Weblogic 类加载器下已配置的依赖项重叠。

    我在这里提到了步骤的完整描述:

    http://javagoogleappspot.blogspot.com/2018/05/make-your-spring-boot-20-compatible.html

    【讨论】:

    • 记得在所有答案中添加署名。
    【解决方案4】:

    在尝试了 Arytom 的解决方案但没有成功后,我们尝试调查 joshaidan 的建议。经过进一步挖掘,我们发现了 Oracle 支持文档:2645919.1

    来自那篇文章:

    原因 应用程序包包含不兼容的 jar 库/类。 WebLogic 内部使用 ASM 库来检查类字节码版本,它有以下类似的代码来检查字节码版本是否兼容,否则将抛出 IllegalArgumentException。 https://github.com/llbit/ow2-asm/blob/master/src/org/objectweb/asm/ClassReader.java

    166 public ClassReader(final byte[] b, final int off, final int len) {
    167   this.b = b;
    168   // checks the class version
    169   if (readShort(off + 6) > Opcodes.V1_8) {
    170     throw new IllegalArgumentException();
    171   }
    

    将类文件版本更新为 53.0 当与 -target 9(显式或隐式指定)一起生成类文件时,javac 将生成主版本号为 53 的类文件。有关版本 53 类文件的详细信息,请参阅 Java 虚拟机规范。 JDK 类本身主要使用 53 版的类文件。 依赖 ASM 或其他字节码操作库的工具或库可能需要这些库的更新版本才能使用 53 版类文件。

    解决方案 将问题类/库替换为兼容版本。

    [oracle@sandbox ~]$ cd ~/war
    [oracle@sandbox war]$ for i in `find . -name '*.jar'`; do unzip -qo $i -d $i.delemete; done
    [oracle@sandbox war]$ find . -name \*.class | xargs file | sort -t, -k2 | tail -n 10
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/InvokeTransactionResponse.class:   compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/MyClient$1.class:                  compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/MyClient.class                     compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/ObjectFactory.class:               compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/package-info.class:                compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/SimpleClientJwsImpl.class          compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/js.jar.delemete/examples/webservices/jaxws/SimpleClientService.class:         compiled Java class data, version 52.0 (Java 1.8)
    ./WEB-INF/lib/jackson-annotations-2.10.2.jar.delemete/module-info.class                 compiled Java class data, version 53.0
    ./WEB-INF/lib/jackson-core-2.10.2.jar.delemete/module-info.class:                       compiled Java class data, version 53.0
    ./WEB-INF/lib/jackson-databind-2.10.2.jar.delemete/module-info.class:                   compiled Java class data, version 53.0
    

    在上面的例子中需要注意的是,最后 3 行是 53.0 版 的类文件,它们将是有问题的类。

    在对我们的应用进行调查后,我们使用 Spring boot 1.5.6.RELEASE 发现 Jersey 依赖项引入了为 JDK9 编译的 asm-all-repackaged:2.5.0-b32。添加以下显式依赖项解决了该问题,在此处找到了解决方案:https://github.com/jersey/jersey/issues/3617

    <!--
                Work around bug where Jersey pulls in asm-all-repackaged:2.5.0-b32, which is compiled for JDK9. This prevents deployment to WebLogic 12.1.3 on JDK8
                https://github.com/jersey/jersey/issues/3617
                Oracle Support Doc ID 2645919.1
            -->
            <dependency>
                <groupId>org.glassfish.hk2.external</groupId>
                <artifactId>asm-all-repackaged</artifactId>
                <version>2.4.0</version>
            </dependency>
    

    【讨论】:

      【解决方案5】:

      尝试去除tomcat的依赖:

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-28
        • 1970-01-01
        • 2017-12-23
        • 2014-09-04
        • 2022-08-10
        • 2014-09-10
        • 2018-03-09
        • 1970-01-01
        相关资源
        最近更新 更多