You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将带依赖的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:57:03