You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java 17迁移:ADF应用在WebLogic 14.1.2中遇模块包读取冲突错误

解决Java 17+WebLogic 14.1.2迁移中ADF内部包模块冲突问题

一、问题根源

Java 9引入的模块系统(JPMS)要求同一个包不能被多个模块导出,WebLogic 14.1.2自带了ADF运行时模块(如adf.share.securityadf.share.support),而你的项目可能同时引入了本地ADF Jar包,导致同一ADF内部包被多个模块重复导出,触发冲突报错。第三方库(如commons.lang3)的冲突则是因为它们读取了JDK 17已内置的包(如javax.namingorg.w3c.dom),同时又依赖了包含相同包的第三方Jar。

二、针对性解决步骤

1. 清理项目中与WebLogic内置ADF重复的Jar包

WebLogic 14.1.2的ORACLE_HOME/oracle_common/modules下已包含完整的ADF运行时Jar,项目无需重复引入:

  • 在JDeveloper中打开Project Properties > Libraries and Classpath
  • 移除所有本地引入的ADF相关Jar(如adf-share-support.jaradf-share-security.jar),仅保留WebLogic自带的ADF关联库(通过添加WebLogic Server库实现)

2. 配置JPMS参数优先使用WebLogic内置模块

若必须保留部分本地ADF Jar,可通过VM参数指定模块优先级:

  • 在JDeveloper的Run/Debug/Profile Settings中添加VM参数:
    --add-modules adf.share.security,adf.share.support
    --limit-modules adf.share.security,adf.share.support
    
    或用--patch-module指定优先加载的Jar:
    --patch-module adf.share.security=path/to/your/adf-share-security.jar
    --patch-module adf.share.support=path/to/your/adf-share-support.jar
    

3. 处理第三方库与JDK内置模块的冲突

对于commons.lang3这类库,需将其标记为自动模块并移除重复的JDK包依赖:

  • 右键冲突的第三方Jar(如commons-lang3.jar)> Properties
  • Module标签页选择Automatic,设置模块名(如org.apache.commons.lang3
  • 彻底移除包含JDK内置包的第三方Jar(如jndi.jarxalan.jar,JDK 17已内置这些包)

4. 调整WebLogic域的模块配置

在WebLogic的setDomainEnv.sh(Windows为setDomainEnv.cmd)中添加JPMS参数,强制优先使用内置ADF模块:

# Linux/Unix
JAVA_OPTIONS="${JAVA_OPTIONS} --add-modules adf.share.security,adf.share.support --limit-modules adf.share.security,adf.share.support"
export JAVA_OPTIONS

# Windows
set JAVA_OPTIONS=%JAVA_OPTIONS% --add-modules adf.share.security,adf.share.support --limit-modules adf.share.security,adf.share.support

5. 用jdeps分析ADF模块依赖

使用JDK自带的jdeps工具定位重复导出的包:

jdeps -verbose:module path/to/your/adf-share-support.jar path/to/your/adf-share-security.jar

根据输出删除其中一个Jar内的重复包目录(若为自定义Jar,可通过jar工具操作)

三、额外注意事项

  • 确保JDeveloper和WebLogic使用的JDK均为17版本,配置保持一致
  • 清理WebLogic域缓存:删除DOMAIN_HOME/servers/[server_name]/tmpcache目录
  • 升级Struts到支持Java 17的版本(如Struts 2.5.30+),避免额外模块冲突

内容的提问来源于stack exchange,提问作者Rishi

火山引擎 最新活动