Maven не может скомпилировать класс, который зависит от rt.jar

CI-сервер (Hudson), за который я несу ответственность, строит проект Maven. После последнего коммита сбой сборки:

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] \hudson\jobs\path to my class\MyClass.java:[33,62] package com.sun.xml.internal.messaging.saaj.packaging.mime.util does not exist
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,5] cannot find symbol
        symbol  : class BASE64EncoderStream
        location: class |fullname of MyClass|
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,38] cannot find symbol
        symbol  : class BASE64EncoderStream
        location: class |fullname of MyClass|
[INFO] 3 errors

Обязательный класс (com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream) находится в rt.jar.

Я попробовал (в соответствии с инструкциями http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies), чтобы добавить системную зависимость в проект pom.xml:

<dependency>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>1</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

Это не помогло.

Самое интересное, что все файлы скомпилированы на локальной машине моего колледжа (он использует встроенный компилятор Eclipse).

В интернете я нашел тот же вопрос (ссылка: http://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-class-td107361.html). Последний ответ заключался в том, что причиной этой проблемы является компилятор Oracle Java.

Итак, я изменил Oracle jdk на OpenJDK, но это не помогло.

Есть ли у кого-нибудь предложения по решению этой проблемы?

Ответ 1

Отсутствующий класс, по-видимому, является внутренним JRE (как указано в его пространстве имен) и не должен ссылаться на ваш код. Вероятно, он доступен только на определенных платформах или версиях JRE.

Рассмотрите возможность замены его другим классом кодировщика Base64, например. один из проект Apache Commmons Codec.

Ответ 2

Нужно указать -XDignore.symbol.file и добавить зависимость rt.jar и <fork>true</fork>, так как плагин компилятора в противном случае молча удаляет любые -XD-флаги: например,

    ...
    <dependency>
        <groupId>groupid</groupId>
        <artifactId>artifiactId</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArgs>
                    <arg>-XDignore.symbol.file</arg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
            ...