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) добавить системную зависимость в проектs pom.xml:


    dummy
    dummy
    1
    system
    ${java.home}/lib/rt.jar

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

Самое интересное, что все файлы прекрасно скомпилированы на локальной машине моего коллеги (он использует встроенный компилятор 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.

Итак, я сменил Oracles jdk в OpenJDK, но это не помогло.

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

 Anshuman04 мая 2015 г., 12:15
Я использовал ByteOutputStream и получил эту ошибку. Когда я изменил его на ByteArrayOutputStream, он работал как шарм. Никогда не знал о внутренних классах JRE.

Ответы на вопрос(2)

Решение Вопроса

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

Попробуйте заменить его другим классом кодера Base64, например, один изПроект кодека Apache Commmons.

Обновление Java 8

Java 8 наконец представила класс Base64 в публичной части JDK:.java.util.Base64

 peterh28 дек. 2013 г., 20:24
С Java 6 существуетБольше не нужно выходить на улицу, чтобы найти утилиты Base64: они находятся вjavax.xml.bind.DatatypeConverter который технически является частью JAXB, но вы можете использовать его независимо от того, используете вы JAXB или нет.
 Henrik Aasted Sørensen12 нояб. 2013 г., 12:52
Я, к сожалению, не знаком с этим классом. Может быть, хорошая тема для совершенно нового вопроса.
 Amir Pashazadeh12 нояб. 2013 г., 12:42
Ну, это было специальное решение, а как насчет других классов? Например небезопасно? Не существует хорошо известной замены, и ее использование требует зависимости от классов Sun. *, что мы можем сделать в Gradle?

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

    ...
    <dependency>
        <groupid>groupid</groupid>
        <artifactid>artifiactId</artifactid>
        <version>1.0</version>
        <scope>system</scope>
        <systempath>${java.home}/lib/rt.jar</systempath>
    </dependency>


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

Ваш ответ на вопрос