Компиляция Maven не удалась, а затмение прошло успешно - PullRequest
7 голосов
/ 03 июля 2011

Я использую maven3.03 и Eclipse 3.5 на Windows XP.Я преобразовал старый веб-проект в стиль конфигурации maven.
Когда я компилирую проект в eclipse, все компилируется.
Примечание: classpath содержит: Maven Dependencies и JDK (1.6_018).
Когда я компилирую из командной строки, используя mvn, я получаю несколько ошибок:
1.package com.sun.xml.internal.stream.buffer.stax не существует.
2.pack com.sun.xml.internal.stream.writers не существует
3.не удается найти символ -символ: класс XMLDOMWriterImpl
4.пакет com.sun.xml.internal.messaging.saaj.util не существует
5.пакет com.sun.xml.internal.bind.v2.runtime.unmarshaller не существует
6.Не могу найти символ - символ: класс NamespaceContexHelper
7.Не могу найти символ: класс ByteOutputStream

Я вижу, что это что-то с солнечной банкой.Но я просто не могу понять, почему Eclipse в порядке, а командная строка - нет.

РЕДАКТИРОВАТЬ : Одна из ошибок, которые я не упомянул в приведенном выше списке:

[ERROR]<path>\EventsViewer.java:[54,69] inconvertible types found: <br>java.util.SortedMap<java.util.Date,java.util.List<com.myClass>>
required: java.util.Map<? extends java.util.Date,? extends java.util.List<com.myOtherClass>>


Когда я вижу ту же строку в затмении, я получаю предупреждение:

Type safety: Unchecked cast from SortedMap<Date,List<myClass>> to Map<? extends Date,? extends 
 List<myOtherClass>>

В Eclipse я получаю предупреждение, а в maven я получаю ошибку.Я проверил org.eclipse.jdt.core.prefs и увидел, что параметр org.eclipse.jdt.core.compiler.problem.forbiddenReference = warning.

Обновление : я прочитал некоторые из вышеперечисленных ошибок.«Проблема» в том, что в затмении это выглядит как неиспользованный импорт.Stangly Maven сообщить об этом как об ошибке.После удаления этого неиспользованного импорта ошибка исчезла.Но все еще возникают проблемы 3 и 7

Заключение : Я полагаю, что предупреждения становятся ошибками в javac.так как я не использую supressWarnings.Я просто удивлен, что ошибка другая.Что это?

Ответы [ 4 ]

9 голосов
/ 10 марта 2014

Это реальная причина, может быть, из ответа форума maven

"Джером прав, что не рекомендуется использовать com.sun классы от rt.jar. И особенно те, которые помечены как «внутренние»; ты просто просить неприятностей.

Однако мне было любопытно, поэтому попробовал. Вышеупомянутый класс может действительно быть доступным для Eclipse. Однако компиляция кода на командная строка с использованием javac завершается с ошибкой «не существует». Так что мой Предполагается, что Java компилятор Sun обнаруживает, когда специальный Доступ к внутреннему классу осуществляется, и он отказывается импортировать класс. Eclipse использует другой компилятор, который, по-видимому, не имеет этой проверки.

Maven просто использует компилятор javac, доступный при выполнении системы дорожка. Поэтому проблема не имеет ничего общего с Maven. Это компилятор, который вызывает maven, который отказывается компилировать исходный код. Я не вижу никаких общедоступных флагов в командной строке javac, чтобы отключить это «блокирование» внутреннего доступа, поэтому если вы не хотите избегать использования Sun's компилятор javac, вам просто нужно избегать использования этого внутреннего класса.

Просто для забавы, я опробовал предложение Джерома поставить rt.jar на Путь к классам: javac -cp /usr/java/jdk1.6.0_03/jre/lib/rt.jar Foo.java но это все еще не удалось собрать.

Класс ByteOutputStream может быть загружен во время выполнения через Class.forName ( "..").

Интересно, что проект, над которым я работаю, действительно импортирует класс com.sun.org.apache.xml.internal.utils.SAXSourceLocator; и это работает нормально. Предупреждения выдаются, но код компилируется (и да, это в моем списке TODO, чтобы исправить это :-). Так что это не все внутренние классы которые блокируются, только выбранные. «

2 голосов
/ 03 июля 2011

Дважды проверьте, что вы используете один и тот же JDK для сборок Eclipse и Maven.Даже если вы так думаете, дважды проверьте еще раз.

Эти пакеты являются одними из тех, которые включены в некоторые версии Java, а не в другие.

0 голосов
/ 16 марта 2016

Это мой случай: у меня та же ошибка в IntelliJ после добавления //TODO, Intellij Автоматически добавил эту строку в раздел импорта import com.sun.xml.internal.bind.v2.TODO;

После удаления вышеупомянутой строки импорта, проблема решена,Теперь я могу успешно компилировать, используя maven

0 голосов
/ 03 июля 2011

Если версия Java отличается, добавьте maven-compiler-plugin

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <target>1.6</target>
                    <source>1.6</source>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

с настройкой источника и цели, указывающей на 1.6, и обновлением конфигурации проекта из контекста проекта Maven.Меню во многих случаях решит проблему несинхронизации (что приводит к разным результатам компиляции):

enter image description here

...