Java 17迁移:ADF应用在WebLogic 14.1.2中遇模块包读取冲突错误
解决Java 17+WebLogic 14.1.2迁移中ADF内部包模块冲突问题
一、问题根源
Java 9引入的模块系统(JPMS)要求同一个包不能被多个模块导出,WebLogic 14.1.2自带了ADF运行时模块(如adf.share.security、adf.share.support),而你的项目可能同时引入了本地ADF Jar包,导致同一ADF内部包被多个模块重复导出,触发冲突报错。第三方库(如commons.lang3)的冲突则是因为它们读取了JDK 17已内置的包(如javax.naming、org.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.jar、adf-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.jar、xalan.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]/tmp和cache目录 - 升级Struts到支持Java 17的版本(如Struts 2.5.30+),避免额外模块冲突
内容的提问来源于stack exchange,提问作者Rishi




