[Oracle Cloud] OCI Java SDK の開発環境を作る (Visual Studio Code, Maven, CentOS)

# はじめに

Oracle Cloud Infrastructure(以下OCI) の Java SDK の開発環境を整える手順を紹介します。毎回思い出しながら環境を構築しているので、備忘録として紹介です。

準備する開発環境は次のものです。

- Visual Studio Code (Remote Development)
- CentOS 7
- OpenJDK 11
- Maven
- OCI SDK (Java)



Visual Studio Code に、Maven を使って OCI SDK(Java) を使えるようにしていきます。



# Vistual Studio Code (Remote Development)

Java Extension Pack を Install

![1605448558140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0ad7224c-3fe9-602b-ee7f-12a37b70926c.png)



# OpenJDK 11

Visual Studio Code で Java を扱うときに、JDK 11 以上だと色々な機能が使えます

```
sudo yum install -y java-11-openjdk java-11-openjdk-devel java-11-openjdk-src
```





# Maven 3.6.3 Install

依存関係を管理するために、Maven を Install します。

以下のURLでダウンロードURLを確認します。
https://maven.apache.org/download.cgi

[![1587385604751.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F104247%2F0ffd981e-7793-0ef6-1c75-cbaf7aeeab18.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=bdbacdbc3edb2c1c26eecf0c8aa26cb3)](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F104247%2F0ffd981e-7793-0ef6-1c75-cbaf7aeeab18.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=bdbacdbc3edb2c1c26eecf0c8aa26cb3)



ダウンロードページでコピーしたURLを使って、CentOS 上に tar.gz ファイルをダウンロードします

```
mkdir ~/maven
cd ~/maven
wget https://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
```



次の手順に従ってインストールしていきます。
https://maven.apache.org/install.html



tar.gz ファイルを解凍

```
tar xfvz apache-maven-3.6.3-bin.tar.gz
```



環境変数設定
bashrc に追記

```
echo 'export PATH=$PATH:$HOME/maven/apache-maven-3.6.3/bin' >> ~/.bashrc
```



bashrc 再読み込み

```
source ~/.bashrc
```



mvn コマンドが実行可能確認します

```
[opc@maven maven]$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/opc/maven/apache-maven-3.6.3
Java version: 1.8.0_252, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "3.10.0-1127.8.2.el7.x86_64", arch: "amd64", family: "unix"
[opc@maven maven]$
```



# Maven Directory

作業用ディレクトリを作成します。

```
mkdir -p ~/java
cd ~/java
```



Maven Project 作成 です。`ociproject` という名前で作成します。

```
mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-simple \
    -DarchetypeVersion=1.4 \
    -DgroupId=com.example \
    -DartifactId=ociproject \
    -Dversion=1.0-SNAPSHOT \
    -Dpackage=com.example
```



Maven Project 作成後、pom.xml の編集をして、依存関係を設定します。

- `<version>1.25.4</version>` とあるように、最新の OCI SDK のバージョンを調べて入れると良い

- `com.sun.activation` を入れないとエラー
-   https://qiita.com/Targityen/items/08d2846c5b6639e805ef

```
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
```

Maven Central Repository を参照して、必要な物を追加する
https://search.maven.org/search?q=g:com.oracle.oci.sdk


```
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.oracle.oci.sdk</groupId>
        <artifactId>oci-java-sdk-bom</artifactId>
        <!-- replace the version below with your required version -->
        <version>1.25.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-audit</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-core</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-database</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-identity</artifactId>
    </dependency>
    <dependency>
      <groupId>com.sun.activation</groupId>
      <artifactId>javax.activation</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>
```



Build Version の調整 (OCI SDK は 8 が必要)

```
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
```



参考 : pom.xml の全てを記載

```
<?xml version="1.0" encoding="UTF-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>com.example</groupId>
  <artifactId>ociproject</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>ociproject</name>
  <description>A simple ociproject.</description>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.oracle.oci.sdk</groupId>
        <artifactId>oci-java-sdk-bom</artifactId>
        <!-- replace the version below with your required version -->
        <version>1.25.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-audit</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-core</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-database</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.oci.sdk</groupId>
      <artifactId>oci-java-sdk-identity</artifactId>
    </dependency>
    <dependency>
      <groupId>com.sun.activation</groupId>
      <artifactId>javax.activation</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>
</project>

```



dependencies で指定した、ライブラリ群を download します。Maven Project 用の Directory のなかで、target/dependency にダウンロードされます。

```
cd ~/java/ociproject
mvn dependency:copy-dependencies
```



ダウンロードされた jar ファイル群の確認です。

```
[opc@vault01 ociproject]$ ls -la target/dependency/
total 19252
drwxrwxr-x. 2 opc opc    4096 Nov 15 14:11 .
drwxrwxr-x. 3 opc opc      24 Nov 15 14:11 ..
-rw-rw-r--. 1 opc opc    3482 Nov 15 14:11 animal-sniffer-annotations-1.14.jar
-rw-rw-r--. 1 opc opc   14768 Nov 15 14:11 aopalliance-repackaged-2.5.0-b42.jar
-rw-rw-r--. 1 opc opc  796532 Nov 15 14:11 bcpkix-jdk15on-1.60.jar
-rw-rw-r--. 1 opc opc 4189874 Nov 15 14:11 bcprov-jdk15on-1.60.jar
-rw-rw-r--. 1 opc opc   31547 Nov 15 14:11 checker-compat-qual-2.0.0.jar
-rw-rw-r--. 1 opc opc  284184 Nov 15 14:11 commons-codec-1.10.jar
-rw-rw-r--. 1 opc opc  208700 Nov 15 14:11 commons-io-2.5.jar
-rw-rw-r--. 1 opc opc  434678 Nov 15 14:11 commons-lang3-3.4.jar
-rw-rw-r--. 1 opc opc   13704 Nov 15 14:11 error_prone_annotations-2.1.3.jar
-rw-rw-r--. 1 opc opc 2590643 Nov 15 14:11 guava-25.0-android.jar
-rw-rw-r--. 1 opc opc  186763 Nov 15 14:11 hk2-api-2.5.0-b42.jar
-rw-rw-r--. 1 opc opc  189454 Nov 15 14:11 hk2-locator-2.5.0-b42.jar
-rw-rw-r--. 1 opc opc  135317 Nov 15 14:11 hk2-utils-2.5.0-b42.jar
-rw-rw-r--. 1 opc opc    8782 Nov 15 14:11 j2objc-annotations-1.1.jar
-rw-rw-r--. 1 opc opc   66894 Nov 15 14:11 jackson-annotations-2.9.8.jar
-rw-rw-r--. 1 opc opc  325619 Nov 15 14:11 jackson-core-2.9.8.jar
-rw-rw-r--. 1 opc opc 1347236 Nov 15 14:11 jackson-databind-2.9.8.jar
-rw-rw-r--. 1 opc opc   33391 Nov 15 14:11 jackson-datatype-jdk8-2.9.8.jar
-rw-rw-r--. 1 opc opc  100674 Nov 15 14:11 jackson-datatype-jsr310-2.9.8.jar
-rw-rw-r--. 1 opc opc   34610 Nov 15 14:11 jackson-module-jaxb-annotations-2.8.10.jar
-rw-rw-r--. 1 opc opc  737884 Nov 15 14:11 javassist-3.22.0-CR2.jar
-rw-rw-r--. 1 opc opc   26366 Nov 15 14:11 javax.annotation-api-1.2.jar
-rw-rw-r--. 1 opc opc    2497 Nov 15 14:11 javax.inject-1.jar
-rw-rw-r--. 1 opc opc    5951 Nov 15 14:11 javax.inject-2.5.0-b42.jar
-rw-rw-r--. 1 opc opc  127509 Nov 15 14:11 javax.ws.rs-api-2.1.jar
-rw-rw-r--. 1 opc opc    2254 Nov 15 14:11 jcip-annotations-1.0.jar
-rw-rw-r--. 1 opc opc  181563 Nov 15 14:11 jersey-client-2.27.jar
-rw-rw-r--. 1 opc opc 1140395 Nov 15 14:11 jersey-common-2.27.jar
-rw-rw-r--. 1 opc opc   69758 Nov 15 14:11 jersey-entity-filtering-2.27.jar
-rw-rw-r--. 1 opc opc   62547 Nov 15 14:11 jersey-hk2-2.27.jar
-rw-rw-r--. 1 opc opc   73055 Nov 15 14:11 jersey-media-json-jackson-2.27.jar
-rw-rw-r--. 1 opc opc   77882 Nov 15 14:11 json-smart-1.3.1.jar
-rw-rw-r--. 1 opc opc   19936 Nov 15 14:11 jsr305-3.0.2.jar
-rw-rw-r--. 1 opc opc  250436 Nov 15 14:11 nimbus-jose-jwt-4.9.jar
-rw-rw-r--. 1 opc opc   75337 Nov 15 14:11 oci-java-sdk-audit-1.5.2.jar
-rw-rw-r--. 1 opc opc  247871 Nov 15 14:11 oci-java-sdk-common-1.5.2.jar
-rw-rw-r--. 1 opc opc 4010670 Nov 15 14:11 oci-java-sdk-core-1.5.2.jar
-rw-rw-r--. 1 opc opc 1380390 Nov 15 14:11 oci-java-sdk-database-1.5.2.jar
-rw-rw-r--. 1 opc opc   20235 Nov 15 14:11 osgi-resource-locator-1.0.1.jar
-rw-rw-r--. 1 opc opc   41203 Nov 15 14:11 slf4j-api-1.7.25.jar
-rw-rw-r--. 1 opc opc   63777 Nov 15 14:11 validation-api-1.1.0.Final.jar
```



mvn install することで、Visual Studio Code からソースコードの Goto Definition が可能。

```
mvn install
```



# log4j に関わる設定

OCI SDK では、log4j を使っています。log4j の設定をしないと Warning が出続けます。今回は、src ディレクトリの下に作ります。

```
mkdir $HOME/java/ociproject/src/main/resources
```



log4j.properties を作成

```
cat <<'EOF' >$HOME/java/ociproject/src/main/resources/log4j.properties
log4j.rootLogger=ERROR,stdout
log4j.logger.com.endeca=INFO
# Logger for crawl metrics
log4j.logger.com.endeca.eidi.web.metrics=INFO

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p\t%d{ISO8601}\t%r\t%c\t[%t]\t%m%n
EOF
```





# Sample Code

ここまでで 開発環境が整いました。SDK の動作確認のため、Sample Code を実行してみましょう。Compute Instance の一覧を表示して、標準出力に出す Sample Code です。

認証のため秘密鍵などを用意したくなかったので、Instance Principleを使っています。
https://qiita.com/sugimount/items/159852749851282a33e6



Sample Code

```java
package com.example;

import com.oracle.bmc.auth.InstancePrincipalsAuthenticationDetailsProvider;
import com.oracle.bmc.core.ComputeClient;
import com.oracle.bmc.core.requests.ListInstancesRequest;
import com.oracle.bmc.core.responses.ListInstancesResponse;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");

        InstancePrincipalsAuthenticationDetailsProvider provider = InstancePrincipalsAuthenticationDetailsProvider
                .builder().build();
        ComputeClient computeClient = new ComputeClient(provider);

        // ListInstancesRequest.builder().build();

        ListInstancesRequest listInstancesRequest = ListInstancesRequest.builder()
                .compartmentId("ocid1.tenancy.oc1..aaaaaaaahysodjbc46bsbxjwtu4hcxos6uxhhldgeeq5yvw4vrwsdz34sfta")
                .build();

        ListInstancesResponse response = computeClient.listInstances(listInstancesRequest);
        // System.out.println(response);

        computeClient.close();
    }
}
```



実行例

```
[opc@java01 ociproject]$  cd /home/opc/java/ociproject ; /usr/lib/jvm/java-11-openjdk-11.0.9.11-0.0.1.el7_9.x86_64/bin/java -Dfile.encoding=UTF-8 @/tmp/cp_5zz9fok3mfupnsg33snsk49h.argfile com.example.App 
Start!
bastion_onpremis
java01
private_machine01
vault01
vyos
End!
```



# 参考URL

https://docs.cloud.oracle.com/ja-jp/iaas/Content/API/SDKDocs/javasdkgettingstarted.htm