将带依赖的Java OPC UA客户端部署至Oracle 19c遇阻求助
问题原因分析
1. 模块信息(module-info)不兼容
Oracle 19c内置的Java 1.8不支持Java 9引入的模块系统,而你使用的Eclipse Milo 0.6.14-SNAPSHOT版本默认打包了module-info.class和META-INF/versions/9/module-info这类模块相关文件,loadjava工具尝试加载这些文件时会触发ORA-29509错误。
2. 包含不兼容的语法或测试类
第二次导入时出现的ParseException,原因有两个:
- 打包的JAR里包含了测试类(比如
BinaryDecoderTest.java),这些类带有Java测试注解(@Test),Oracle的Java解析器无法正确处理; - Milo的部分代码使用了Java 8特性,但Oracle的JVM对某些语法(比如接口默认方法
default)的兼容性存在问题,或者打包时未正确处理依赖类的编译级别。
解决步骤
步骤1:修正项目的Maven配置(pom.xml)
修改你的项目pom.xml,确保编译级别为Java 8,排除测试类与模块相关文件,同时正确打包所有依赖:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>OPCUA</groupId> <artifactId>ORACLE</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ORACLE</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 指定编译和运行的Java版本为1.8 --> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- 引入Milo生产环境核心依赖 --> <dependency> <groupId>org.eclipse.milo</groupId> <artifactId>sdk-client</artifactId> <version>0.6.14-SNAPSHOT</version> </dependency> <dependency> <groupId>org.eclipse.milo</groupId> <artifactId>stack-core</artifactId> <version>0.6.14-SNAPSHOT</version> </dependency> <dependency> <groupId>org.eclipse.milo</groupId> <artifactId>stack-client</artifactId> <version>0.6.14-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <!-- 编译插件:强制Java 8级别,排除模块文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <excludes> <exclude>module-info.java</exclude> </excludes> </configuration> </plugin> <!-- 打包插件:构建包含所有依赖的JAR,排除测试类和模块文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>module-info.class</exclude> <exclude>META-INF/versions/**</exclude> <exclude>**/*Test.class</exclude> <exclude>**/*Tests.class</exclude> </excludes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 指定主类路径 --> <mainClass>OPCUA.ORACLE.OPCUA</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <!-- 跳过测试环节,避免打包测试类 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
步骤2:重新构建JAR包
在项目根目录执行Maven命令,生成符合要求的JAR:
mvn clean package
构建完成后,target目录下会生成包含所有依赖的JAR文件(文件名类似ORACLE-0.0.1-SNAPSHOT.jar)。
步骤3:使用loadjava导入JAR
执行以下命令导入JAR,添加参数确保依赖解析与兼容性:
loadjava -user user/password@db -resolve -force -verbose ORACLE-0.0.1-SNAPSHOT.jar
参数说明:
-resolve:自动解析并加载依赖类;-force:强制覆盖已存在的类;-verbose:显示详细日志,方便排查问题。
步骤4:测试运行
在Oracle中调用Java程序:
SET SERVEROUTPUT ON; CALL DBMS_JAVA.RUNJAVA('OPCUA.ORACLE.OPCUA');
额外注意事项
- 授予网络权限:如果OPC UA客户端需要连接外部服务器,需给数据库用户授予网络权限:
GRANT JAVA_NET_PERMISSION TO user; - 优先使用稳定版本:Milo的SNAPSHOT版本可能包含未稳定代码,建议替换为0.6.13等稳定版本,减少兼容性问题。
内容的提问来源于stack exchange,提问作者Bartosz
相关产品推荐
相关产品推荐

