次の行でエラーが発生しています(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>
それでも同じエラーが発生します。
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>
結果を共有してください。
私はあなたの問題を解決するために小さなスプリングブートプロジェクトを作成しました。
MacOS Catalinaでspring-boot 2.2.7 RELEASE
、Spring Tools Suite 4 IDE
、AdoptedOpenJDK 11
を使用しています。
簡単なメモ:jaxb-impl
&jaxb-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を使用したヘッダーオブジェクト
さて、
プロジェクト構造:
表示するサンプル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
したときは、完全に機能します
出力:
demo-0.0.1-SNAPSHOT-executable.jar
を使用してプロジェクト構造で確認できるように、mvn install
という名前のファットjarも作成しました。
この瓶の外で走るとエラーを出さずに完璧に動作します。
出力:
生成されたheader.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authreader>
<token>set the token</token>
</authreader>