
# 在Java工程中部署数据建模引擎运行SDK
xDM-F不仅支持以独立服务的方式部署数据建模引擎运行SDK，还支持以依赖引入的方式嵌入用户已存在的项目中，将其作为一个数据底座，提供可直接调用的xDM-F内置Service方法，减少网络IO。
如下操作以Windows 11操作系统的本地服务器为例。
#### 准备事项
在部署数据建模引擎运行SDK之前，需要提前准备如下事项。
- 从[Oracle官网](https://www.oracle.com/technetwork/java/archive-139210.html)下载和安装推荐使用的JDK版本。
  推荐使用的JDK版本：JDK 17以上版本。
  
- 根据开发需要，下载并安装开发工具，例如Eclipse IDE、IntelliJ IDEA等。 本文以IntelliJ IDEA开发工具为例。
  
- 获取SDK包和License文件。 如何获取SDK请参见[获取数据建模引擎SDK](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0009.html)。
  
 
#### 操作步骤
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. 在弹出的窗口中，单击![](https://support.huaweicloud.com/sdkreference-idme/figure/zh-cn_image_0000002137035601.png)，依次添加对应资源的配置信息。
      请根据实际的[数据建模引擎运行SDK资源规划](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0008.html#ZH-CN_TOPIC_0000002101358320__section15530131311115)，按需添加。
      图1添加环境变量   
      ![](https://support.huaweicloud.com/sdkreference-idme/figure/zh-cn_image_0000002101716262.png "点击放大") 
   
   4. 单击"OK"。
   
   
   
   
6. 在已有的Maven工程中，单击![](https://support.huaweicloud.com/sdkreference-idme/figure/zh-cn_image_0000002137195229.png)，启动项目。
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资源规划](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0008.html#ZH-CN_TOPIC_0000002101358320__section15530131311115)中规划了单点登录的相关资源/云服务，并在项目中添加了对应的单点登录配置信息，可以选择此方式进行验证。
     在浏览器中访问如下地址，查看服务是否启动成功。
     ```
     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包   
![](https://support.huaweicloud.com/sdkreference-idme/figure/zh-cn_image_0000002101556430.png "点击放大")
您可以参考如下操作进行修复。
1. 右键单击引入失败的JAR包，选择"Add as Library"。
2. 在弹出的窗口中，选择"Classes"，单击"OK"。
3. 在弹出的窗口中，将"Level"设置为"Module Library"，单击"OK"。
   图3添加Library   
   ![](https://support.huaweicloud.com/sdkreference-idme/figure/zh-cn_image_0000002137035609.png "点击放大") 
 
