更新时间:2025-11-06 GMT+08:00
分享

在Java工程中部署数据建模引擎运行SDK

xDM-F不仅支持以独立服务的方式部署数据建模引擎运行SDK,还支持以依赖引入的方式嵌入用户已存在的项目中,将其作为一个数据底座,提供可直接调用的xDM-F内置Service方法,减少网络IO。

如下操作以Windows 11操作系统的本地服务器为例。

准备事项

在部署数据建模引擎运行SDK之前,需要提前准备如下事项。

  • Oracle官网下载和安装推荐使用的JDK版本。

    推荐使用的JDK版本:JDK 17以上版本。

  • 根据开发需要,下载并安装开发工具,例如Eclipse IDE、IntelliJ IDEA等。

    本文以IntelliJ IDEA开发工具为例。

  • 获取SDK包和License文件。

    如何获取SDK请参见获取数据建模引擎SDK

操作步骤

  1. 解压缩已获取的SDK包。
  2. 将解压缩后“lib”文件夹下的所有文件引入到已有的Maven工程中。

    1. “resources”目录下,单击File > Project Structure
    2. 在弹出的窗口中,选择Modules > Dependencies,单击+ > JARs or Directories…
    3. 全选“lib”文件夹下的所有文件,单击“OK”
    4. 单击“Apply”

  3. 在启动类上方添加如下注解。

    @SpringBootApplication
    @EnableAsync(proxyTargetClass = true)
    @EnableScheduling
    @ComponentScan(
        basePackages = {"com.huawei.it", "com.huawei.innovation", "com.huawei.iit", "com.huawei.opendme", "com.huawei.xdm"})
    @PropertySource(value = {"classpath:application.properties"})
    @EnableCaching

  4. 在启动类中添加System.setProperty()方法,设置“olc.config.path”系统属性。

    System.setProperty("olc.config.path", "D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc");

    其中,“D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc”“lib”文件夹下“microserviceTemplate.app-1.0.0-SNAPSHOT-small.jar”中的olc所在路径。

    完整的示例代码如下:

    package com.sz;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    /**
     * 启动类
     *
     **/
    @SpringBootApplication
    @EnableAsync(proxyTargetClass = true)
    @EnableScheduling
    @ComponentScan(
        basePackages = {"com.huawei.it", "com.huawei.innovation", "com.huawei.iit", "com.huawei.opendme", "com.huawei.xdm"})
    @PropertySource(value = {"classpath:application.properties"})
    @EnableCaching
    public class SdkApplication {
    
        public static void main(String[] args) {
            SpringApplication app = new SpringApplication(SdkApplication.class);
            System.setProperty("olc.config.path", "D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc");
            app.run(args);
        }
    }

  5. 在已有的Maven工程中,添加SDK启动配置。

    1. 单击SdkApplication > Edit Configurations...
    2. 在弹出的窗口中,单击“Environment variables”
    3. 在弹出的窗口中,单击,依次添加对应资源的配置信息。

      请根据实际的数据建模引擎运行SDK资源规划,按需添加。

      图1 添加环境变量
    4. 单击“OK”

  6. 在已有的Maven工程中,单击,启动项目。
  7. 完成部署后,xDM-F支持如下几种验证方式。您可以根据实际情况选择验证。

    • 方式一:查看服务日志

      在项目运行日志中如果存在如下类型信息,则说明启动成功。

      Started RdmApplication in xxx.xxx seconds (JVM running for xxx.xxx)
    • 方式二:调用指定接口

      项目启动后,约等待2分钟,调用如下健康检查接口,查询服务是否正常启动。

      http://{部署服务器的IP地址}:{部署服务器的端口号}/rdm_{应用的唯一标识}_app/services/v1/health

      例如:

      http://127.0.0.1:8003/rdm_123456_app/services/v1/health

      显示结果为如下信息,则说明启动成功。

      {"result":"SUCCESS","data":["success"],"errors":[]}
    • 方式三:访问可视化页面

      如果您已在数据建模引擎运行SDK资源规划中规划了单点登录的相关资源/云服务,并在项目中添加了对应的单点登录配置信息,可以选择此方式进行验证。

      在浏览器中访问如下地址,查看服务是否启动成功。

      http://{部署服务器的IP地址}:{部署服务器的端口号}/rdm_{应用的唯一标识}_app/services/index.html

      例如:

      http://127.0.0.1:8003/rdm_123456_app/services/index.html

      转入应用运行态登录页面,输入登录账号和登录密码,成功登录并进入应用运行态页面,即表示启动成功。

配置解密(可选)

当在Maven工程中引入SDK包后,如果用户已通过加密算法对敏感信息进行加密,可按照以下步骤进行二次开发,实现服务启动时的自动解密功能,保障运行时配置的可用性。

以下将以Base64加密为例,指导您如何通过二次开发实现服务启动时的自动解密功能。

  1. 在配置文件(如“application.properties”)中,添加加密后的配置项。

    例如,添加部署阶段已加密的数据库密码。其示例如下:

    # 数据库密码(部署阶段已加密)
    # 格式:{解密前缀}{加密内容}
    # (XdmNeedDec)为解密前缀,用于标识该配置项需要解密,客户可自定义该前缀
    RDS_PASSWORD=(XdmNeedDec)123456
  2. 创建自定义加密工具类(如“MyCryptoTool”),实现com.huawei.xdm.security.tool.IEncryptTool接口,用于对带特定前缀的加密配置项进行自动解密。

    示例代码:

    public class MyCryptoTool implements IEncryptTool {
       // 解密前缀标识,必须与配置文件中加密配置项的前缀保持一致
       // 示例:配置文件中需解密项格式为(XdmNeedDec)加密内容
       private static final String NEED_DEC_FLAG = "(XdmNeedDec)";
    
       /**
        * 加密工具优先级设置
        * 为确保本工具优先于xDM-F内置工具生效,优先级应设置为高于Ordered.LOWEST_PRECEDENCE
        * 值越小,优先级越高
        * 推荐值:Ordered.LOWEST_PRECEDENCE - 1
        * 
        * @return 优先级数值
        */
       @Override
       public int getOrder() {
          return Ordered.LOWEST_PRECEDENCE - 1;
       }
    
       /**
        * 获取解密前缀,xDM-F通过此方法识别需要解密的配置项
        * 
        * @return 解密前缀字符串
        */
       @Override
       public String getNeedDecryptPrefix() {
          return NEED_DEC_FLAG;
       }
    
       /**
        * 加密方法(当前场景无需实现,返回空字符串即可)
        * 
        * @param plainText 待加密的明文内容
        * @return 加密后的密文字符串
        */
       @Override
       public String encrypt(String plainText) {
          return "";
       }
    
       /**
        * 带解密前缀的加密方法(当前场景无需实现,返回空字符串即可)
        * 
        * @param plainText 待加密的明文内容
        * @return 带解密前缀的加密字符串
        */
       @Override
       public String encryptWithPrefix(String plainText) {
          return "";
       }
    
       /**
        * 解密方法,xDM-F会自动调用此方法解密带指定前缀的配置项
        * 示例使用Base64,请根据实际加密算法替换此处逻辑
        * 
        * 
        * @param cipherText 待解密的加密内容
        * @return 解密后的明文
        */
       @Override
       public String decrypt(String cipherText) {
          if (StringUtils.isEmpty(cipherText)) {
             return cipherText;
          }
          byte[] decode = Base64.getDecoder().decode(cipherText.getBytes(StandardCharsets.UTF_8));
          return new String(decode, StandardCharsets.UTF_8);
       }
    
       /**
        * 控制是否加载指定配置项。true:加载并使用此工具;false:忽略此工具
        * 必须返回true,否则当前加密工具类不会被xDM-F启用。
        * 
        * @param configKey 配置项键名
        * @return 始终返回true,启用当前工具
        */
       @Override
       public boolean needLoad(String configKey) {
          return true;
       }
    }
  3. 在项目的“resources”目录下,创建SPI配置文件“/META-INF/services/com.huawei.xdm.security.tool.IEncryptTool”,并写入自定义解密工具类(MyCryptoTool)的全路径类名。
    SPI配置文件示例:
    com.huawei.it.crypt.MyCryptoTool

完成以上步骤后,您的项目核心结构应如下所示:

项目结构
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
|   |   |   |   └── huawei
|   |   |   |   |   ├── it
|   |   |   |   |   |   └── crypt
|   |   |   |   |   |   |   └── MyCryptoTool
|   |   |   |   |   └── xdm
|   |   |   |   |   |   └── demo02
|   |   |   |   |   |   |   └── Demo02Application
│   │   └── resources
│   │   │   ├── META-INF
|   |   |   |   └── services
|   |   |   |   |   └── com.huawei.xdm.security.tool.IEncryptTool 
|   |   |   ├── application-sdk.properties
|   |   |   └── license.dat
└── lib
|   └── xDM-F的SDK依赖包

异常处理

引入SDK包下的文件到Maven工程时,可能会存在引入失败的情况。如下图所示:

图2 引入失败的JAR包

您可以参考如下操作进行修复。

  1. 右键单击引入失败的JAR包,选择“Add as Library”
  2. 在弹出的窗口中,选择“Classes”,单击“OK”
  3. 在弹出的窗口中,将“Level”设置为“Module Library”,单击“OK”
    图3 添加Library

相关文档