web-dev-qa-db-ja.com

JAXB-APIの実装が見つかりません(実行中Java jar)

次の行でエラーが発生しています(JAXBContext.newInstance):

    @Override
    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
    SoapHeader soapHeader = ((SoapMessage)message).getSoapHeader();

    try {
        JAXBContext context = JAXBContext.newInstance(AuthHeader.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(authentication, soapHeader.getResult());

    } catch (JAXBException e) {
        System.out.println(e.getMessage());
        throw new IOException("error while marshalling authentication.");
    }
}

これを使用してテストケースとして実行すると、正常に動作しますが、

 mvn install

またはmvn:spring:boot run

しかし、jarを使用して実行すると問題が発生します。

Java -jar target/fileName-0.0.1-SNAPSHOT.jar 

Java -jarの実行中にエラーが発生し、postmanを使用してヒットした。

Implementation of JAXB-API has not been found on module path or classpath.

Java.io.IOException: error while marshalling authentication.

バージョン情報

mvn -version
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.7, vendor: Ubuntu, runtime: /usr/lib/jvm/Java-11-openjdk-AMD64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-1051-aws", Arch: "AMD64", family: "unix"

Java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing)

同じjarは開発サーバーでは問題なく動作しますが、ステージングサーバーでは動作しません。開発サーバーとステージングサーバーの両方が同じ環境(Javaバージョン、mvn、すべて同じ)である。これらの依存関係をpom.xmlに追加しました。

    <dependency>
        <groupId>com.Sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.3</version>
    </dependency>

それがファットjarに関連している場合、Amazon s3、stripeなどの他の依存関係が通常のjarで動作する理由。 jaxbのみの問題は何ですか?

私は次の設定でmvnパッケージを使用してファットjarを作成しようとしました:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <mainClass>com.patracorp.patrapay.PatrapayApplication</mainClass>
                    <layout>Zip</layout>
                </configuration>
            </execution>
        </executions>
    </plugin>

それでも同じエラーが発生します。

7
Vivek Sadh

Java 9以降のバージョンでは、JavaがJava.xml.bindそのデフォルトのクラスパスから。そのため、クラスパスにJARファイルを明示的に追加する必要があります。

そして、jaxb-implでは不十分だと思います。
以下の依存関係をPOMに追加して、それを試してみることはできますか?.

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>${jaxb-api.version}</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>${jaxb-api.version}</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>${jaxb-api.version}</version>
    </dependency>

結果を共有してください。

2
Tarun Verma

私はあなたの問題を解決するために小さなスプリングブートプロジェクトを作成しました。

MacOS Catalinaでspring-boot 2.2.7 RELEASESpring Tools Suite 4 IDEAdoptedOpenJDK 11を使用しています。

簡単なメモ:jaxb-impljaxb-core最新バージョン(古いバージョンではない)を追加する必要があります。

そうしないと、コンソールに次のメッセージが表示されることがあります。

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by ......
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

注意すべきもう1つのこと:jax-wsとjaxbを使用したSOAPマーシャリングに問題があると思われます。

もしそうなら、これを参照してくださいSO質問: Add SOAP純粋なJAX-WSを使用したヘッダーオブジェクト


さて、

プロジェクト構造:

enter image description here

表示するサンプルAuthHeaderクラスを作成しました。

package com.example.demo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "authreader")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class AuthHeader {

    private String token;

    public AuthHeader() {
        super();
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    @Override
    public String toString() {
        return "AuthHeader [token=" + token + "]";
    }

}

テストのために、問題を引き起こしていたコードの一部を取った。

DemoApplication.Java:

package com.example.demo;

import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.OutputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) throws JAXBException, FileNotFoundException {
        // for testing.
        JAXBContext context = JAXBContext.newInstance(AuthHeader.class);
        Marshaller marshaller = context.createMarshaller();
        AuthHeader header = new AuthHeader();
        header.setToken("set the token");
        OutputStream os = new FileOutputStream("header.xml");
        marshaller.marshal(header, os);
        // call the boot 
        SpringApplication.run(DemoApplication.class, args);
    }

}

最も重要なこと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 https://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <Java.version>11</Java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>com.Sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>executable</classifier>
                            <mainClass>
                                com.example.demo.DemoApplication
                            </mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

私がmvn:spring:boot runしたときは、完全に機能します

出力:

enter image description here

demo-0.0.1-SNAPSHOT-executable.jarを使用してプロジェクト構造で確認できるように、mvn installという名前のファットjarも作成しました。

この瓶の外で走るとエラーを出さずに完璧に動作します。

出力:

enter image description here

生成されたheader.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authreader>
  <token>set the token</token>
</authreader>
0
Anish B.