6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JAXB Reference implementation と DatatypeConverterImpl の行方

Last updated at Posted at 2020-02-15

概要

  • JAXB (Java Architecture for XML Binding) の公式に近い Reference implementation (参照実装) の jar とソースコードをバージョン毎に追いかける
  • 動作確認環境: Java 11 (AdoptOpenJDK 11.0.6+10) + Gradle 6.1

調査した JAXB 一覧

JAXB バージョン パッケージ名 Gradle implementation 記述
2.3.1 javax.xml.bind javax.xml.bind:jaxb-api:2.3.1
2.3.2 javax.xml.bind jakarta.xml.bind:jakarta.xml.bind-api:2.3.2
2.3.3 javax.xml.bind ?
2.4.0 javax.xml.bind javax.xml.bind:jaxb-api:2.4.0-b180830.0359
3.0.0 jakarta.xml.bind jakarta.xml.bind:jakarta.xml.bind-api:3.0.0-RC1

JAXB 2.3.1

Maven Repository: javax.xml.bind » jaxb-api » 2.3.1

build.gradle ファイルを用意。
dependencies に implementation 'javax.xml.bind:jaxb-api:2.3.1' を記述することで使用できる。

build.gradle
plugins {
  id 'java'
  id 'application'
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'javax.xml.bind:jaxb-api:2.3.1'
}

application {
  mainClassName = 'Sample'
}

JAXB を使用するサンプル src/main/java/Sample.java を用意。

import java.security.SecureRandom;
import javax.xml.bind.DatatypeConverter; // JAXB のクラス

public class Sample {
  public static void main(String[] args) {
    byte[] bytes = new byte[32];
    new SecureRandom().nextBytes(bytes);
    // JAXB のクラスを使用
    String str = DatatypeConverter.printHexBinary(bytes);
    System.out.println(str);
  }
}

gradle run で実行。

$ gradle run

> Task :run
20982DD2EA72EFA26763A6256209BCDC0F500C7F6BC26993FCB9690022E109FD

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date

実行したサンプルは JAXB の内部で DatatypeConverterImpl クラスを使用している。

DatatypeConverterImpl クラスのソースコード。パッケージは javax.xml.bind となる。
GitHub 等のリポジトリでソースコードが見つからなかったため https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1-sources.jar を展開した。

private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

JAXB 2.3.2 (Jakarta XML Binding 2.3.2)

Eclipse Enterprise for Java (EE4J) からの最初のリリース。
EE4J は Oracle から Java EE を移管するプロジェクト。

2.3.2 | projects.eclipse.org

First release from Eclipse. No API or implementation changes, just new licensing and Maven coordinates.

2.3.2 | projects.eclipse.org

Release Date:
Friday, December 14, 2018

Deliverables:
Project binaries, sources and javadoc available through Maven repository.

Compatibility:
This is the first release of Eclipse Project for JAXB, which is fully binary compatible with previous releases of the JavaTM Architecture for XML Binding API Implementation released by Oracle.

Maven Repository: jakarta.xml.bind » jakarta.xml.bind-api » 2.3.2

build.gradle の dependencies に以下を記述することで使用できる。

build.gradle
dependencies {
  implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
}

DatatypeConverterImpl クラスのソースコード。パッケージは javax.xml.bind となる。

private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

JAXB 2.3.3 (Jakarta XML Binding 2.3.3)

2.3.3 | projects.eclipse.org

First release going through the JESP. Bug fix release of 2.3.2.

Release Date:
Wednesday, February 19, 2020

Maven Central Repository には見つからなかった。

DatatypeConverterImpl クラスのソースコード。パッケージは javax.xml.bind となる。

private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

JAXB 2.4.0

Maven Repository: javax.xml.bind » jaxb-api » 2.4.0-b180830.0359

build.gradle の dependencies に以下を記述することで使用できる。

build.gradle
dependencies {
  implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
}

DatatypeConverterImpl クラスのソースコード。パッケージは javax.xml.bind となる。
GitHub 等のリポジトリでソースコードが見つからなかったため https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359-sources.jar を展開した。

private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

似たようなバージョンのファイルが他の場所にあるが、パッケージが com.sun.xml.bind になっている別物。

Maven Repository: com.sun.xml.bind » jaxb-ri » 2.4.0-b180830.0438

compile group: 'com.sun.xml.bind', name: 'jaxb-ri', version: '2.4.0-b180830.0438', ext: 'pom'

@Deprecated
private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

@Deprecated
public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

GlassFish JAXB の DatatypeConverterImpl も同じく com.sun.xml.bind パッケージだった。

Maven Repository: org.glassfish.jaxb » jaxb-runtime » 2.4.0-b180830.0438

JAXB 3.0.0 (Jakarta XML Binding 3.0)

このバージョンからパッケージ名が javax.xml.bind から jakarta.xml.bind に変更されている。

3.0 | projects.eclipse.org

Change javax.* package name to jakarta.*

Release Date:
Friday, February 7, 2020

Release Type:
Major release (API breakage)

Jakarta EE の Web サイトには 「under development (開発中)」 と書かれている。

Jakarta XML Binding 3.0 (under development) | The Eclipse Foundation

Maven Repository: jakarta.xml.bind » jakarta.xml.bind-api » 3.0.0-RC1

build.gradle の dependencies に以下を記述することで使用できる。

build.gradle
dependencies {
  implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.0-RC1'
}

JAXB を使用するサンプル src/main/java/Sample.java を用意。
今回のサンプルではパッケージ名を javax.xml.bind から jakarta.xml.bind に変更しただけで動作した。

import java.security.SecureRandom;
import jakarta.xml.bind.DatatypeConverter; // JAXB のクラス

public class Sample {
  public static void main(String[] args) {
    byte[] bytes = new byte[32];
    new SecureRandom().nextBytes(bytes);
    // JAXB のクラスを使用
    String str = DatatypeConverter.printHexBinary(bytes);
    System.out.println(str);
  }
}

DatatypeConverterImpl クラスのソースコード。パッケージは jakarta.xml.bind となる。

private static final char[] hexCode = "0123456789ABCDEF".toCharArray();

public String printHexBinary(byte[] data) {
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
        r.append(hexCode[(b >> 4) & 0xF]);
        r.append(hexCode[(b & 0xF)]);
    }
    return r.toString();
}

参考資料

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?