Настройки Eclipse влияют на сборку командной строки Maven? - PullRequest
3 голосов
/ 09 октября 2009

Большинство наших проектов построены с Maven, и некоторые из них используют классы в пакете com.sun. Это плохая практика, но я мало что могу с этим поделать.

Некоторое время это не казалось большой проблемой. Затем, в какой-то момент, сборки начали давать сбой для меня с такими ошибками, как:

java.lang.Error: Unresolved compilation problems:
        Access restriction: The type TextSerializer is not accessible due to res
triction on required library C:\Program Files\Java\jre1.5.0_15\lib\rt.jar

Это достаточно справедливо, но я не мог понять, как отключить эту проверку. Сборки терпели неудачу как из командной строки, так и из Eclipse, поэтому я предположил, что это должен быть некоторый параметр Maven.

В конце концов я понял, что проблема как-то связана с Eclipse . Я перешел в «Настройки»> «Java»> «Компилятор»> «Ошибки / предупреждения»> «Устаревший и ограниченный API» и изменил «Запрещенную ссылку» на «Предупреждение». После этого мои сборки начали работать. Это совершенно непонятно для меня, потому что я получал ошибки при сборке из командной строки .

Может кто-нибудь объяснить мне, как настройка Eclipse может как-то повлиять на поведение сборки из командной строки?!

Ответы [ 5 ]

4 голосов
/ 10 октября 2009

Вы столкнулись с ошибкой компиляции для ограниченных классов , упомянутой в FAQ для m2eclipse, и применили то же решение, что и в FAQ:

Проекты с использованием классов от rt.jar, такие как com.sun.* (и некоторые другие) может иметь ошибки компиляции, такие как: «Ограничение доступа: тип RE недоступен из-за ограничений на необходимая библиотека /lib/rt.jar ". Такие ошибки указывают на использование не-API классов и эти правила доступа определяются Затмение JDT.

Вы можете изменить настройки компилятора на не подведет эти ограничения в настройки рабочего пространства в Window / Предпочтения / Java / Компилятор / Ошибки / Предупреждения / Устаревшие и API с ограниченным доступом / Запрещенная ссылка (правила доступа) / Предупреждения; или же за проект от Project / Properties / Java Compiler / Ошибки / Предупреждения / Устаревший и ограниченный API / Запрещенная ссылка (правила доступа) / Предупреждения

Это, конечно, не должно влиять на JDK вне Eclipse. Сказав это, вы написали в комментарии, что Eclipse настроен на использование того же JRE, что и Maven, но ... Maven нужен JDK для компиляции классов (ему нужен javac). Поэтому я предполагаю, что вы на самом деле используете компилятор не-javac и у вас где-то объявлен compilerId . Примерно так:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <compilerId>eclipse</compilerId>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-compiler-eclipse</artifactId>
      <version>xxxx</version>
    </dependency>
  </dependencies>
</plugin>

Это говорит компилятору-плагину использовать компилятор eclipse и, так или иначе, его настройки.

РЕДАКТИРОВАТЬ: Согласно комментарию, упомянутая выше гипотеза не распространяется на ФП.

Моим следующим предложением было попытаться воспроизвести проблему, но запустить mvn clean до compile например ::1010**

mvn clean install

Как сообщалось, похоже, что это решает проблему (как я и ожидал). Я должен был подумать об этом немедленно: Eclipse создает файлы .class даже для классов с ошибками компиляции. Следовательно (не очень) странное поведение на уровне командной строки maven решается с помощью clean.

На самом деле мой совет - использовать настройки, указанные в Как настроить проект Maven для использования отдельных папок вывода в Eclipse , чтобы избежать подобных проблем. Это было на самом деле значение по умолчанию m2eclipse до версии 0.9.4. Причины этого изменения обсуждаются в этой ветке списка разработчиков .

1 голос
/ 18 апреля 2012

Я считаю полезным дать сборкам Eclipse отдельный каталог от сборок Maven CLI:

Вставьте следующее в ваш pom.xml. Наличие свойства «m2e.version» активирует следующий профиль, который изменяет местоположение сборки Eclipse

<profiles>
  <profile>
    <id>IDE</id>
    <activation>
      <property>
        <name>m2e.version</name>
      </property>
    </activation>
    <build>
      <!-- Put the IDE's build output in a folder other than target, so that IDE builds don't interact with Maven builds -->
      <directory>target-ide</directory>
    </build>
</profile>
0 голосов
/ 23 августа 2010

Я вижу похожие проблемы при использовании Netbeans (6.9.1) с проектом Maven. mvn clean решает проблему.

0 голосов
/ 22 декабря 2009

да "чистый" ключ Тем не менее, обратите внимание, что дело не только в том, что вокруг него возникают сбои - так или иначе m2eclipse просто оставляет мусор позади, даже если он компилируется правильно.

Это также может вызвать такие вещи, как

java.lang.Error: Нерешенная проблема компиляции:

из командной строки

0 голосов
/ 12 октября 2009

Мой коллега услужливо указал, что mvn clean install решает проблему. В конце концов мы выяснили, что (M2) Eclipse оставляет некоторые частично скомпилированные классы в целевом каталоге, и, конечно же, vanilla Maven не знает, что ему следует перекомпилировать эти классы. Я немного раздражен по этому поводу. Для всех должно быть очевидно, что оставление поврежденного вывода в целевом каталоге неизбежно приведет к незначительному загрязнению последующих сборок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...