2015-03-13 3 views
0

У меня есть проект с pom.xml, который имеет следующую <build> заявление:Сборка и установка Maven артефакты на Java 8

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

Когда я бегу mvn install на этом проекте, он компилирует проект, запускает юнит-тесты и публикует это к моему местному репо. Я пытаюсь узнать немного больше о Maven здесь, и я с трудное время нахождения документации/разъяснения по следующему:

  • Как я смог запустить mvn install, если POM не объявляет его под build/plugins ? maven-compiler-plugin включает maven-install-plugin, если да, то как я мог это понять?
  • Самое важное: значение build/plugins/plugin/configuration/source и .../target оба установлены на 1.8. Если на моей машине есть Java 8, и я запускаю mvn install в этом проекте без каких-либо ошибок, делает ли это гарантию, что проект строит с Java 8? Я смотрю на docs for the Compiler Plugin и не вижу этих source/target конфигураций, перечисленных в любом месте.
+1

Для документов смотрите здесь: http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html – khmarbaise

+0

Спасибо @khmarbaise (+1) - из этой ссылки я нашел [Lifecycle Doc ] (http://maven.apache.org/ref/3.2.5/maven-core/lifecycles.html) и посмотрите, что 'compile' находится выше по потоку от' install', что затем объясняет, почему триггеры 'install' «компилировать».Однако это не объясняет, почему POM объявляет плагин компилятора, но не плагин установки. Мысли? – smeeb

+0

@smeeb, потому что это не обязательно. maven поставляется в комплекте с компилятором и плагином установки - они встроены. Почти каждая версия maven поставляется с другой версией этих плагинов. Вы меняете версию или настраиваете ее, но вам этого не нужно. Например. если вы хотите сообщить компилятору плагин _how_ (какой языковой уровень) для компиляции. – Alexander

ответ

4

Сначала вы должны узнать, что такое жизненный цикл сборки и как она работает, и как плагины are bound to the life cycle by default.

Кроме того, вы должны понимать, что в Maven каждый проект наследуется от файла super pom, который является частью дистрибутива maven (пакет, который вы загрузили). Super pom определяет макет папки по умолчанию и некоторые версии плагинов.

Вопрос для определения плагина maven-compiler, как и вы, должен быть очень точным, просто неправильно. Вы должны были определить его как следующее:

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

Это перезаписать определение, которое наследуется супер ПОМ и изменения его конфигурации. В вашем случае я бы предложил изменить определение в этом:

<project> 
    ... 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
     <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
     </pluginManagement> 
    </build> 
    .. 
    </project> 

Кодирование должно быть установлено глобально причина есть и другие плагины, которые используют это определение, как в maven-resources-plugin. Использование этого свойства упрощает это, поэтому каждый плагин, который имеет возможность кодирования, будет использовать default as defined in the property.

Для правильной версии Java (вашего JDK на вашем компьютере) вам необходимо использовать maven-enforcer-plugin.

Помимо этого, взгляните на plugins page which shows the most up-to-date releases of the plugins.

В качестве хорошей документации я могу пересчитать Books on Maven, но имейте в виду, что они написаны с учетом Maven 2. Поэтому, если что-то неясно спросить у пользователей список рассылки здесь на SO.

+0

Спасибо @khmarbaise (+1) - это действительно отличный ответ, и я полностью буду копаться во всех тех ссылках, которые вы опубликовали. Спасибо! Однако в краткосрочной перспективе я все еще не полностью понимаю декларации '1.8' для плагина компилятора. Все, что я хочу сделать, это то, что моя библиотека компилирует и создает пакеты (сборки) на Java 8. С вашими предложенными изменениями выполнение 'mvn install' успешно подтвердит это? Еще раз спасибо! – smeeb

+0

Вы должны знать, что, например, Javak javac-компилятор JDK 9 имеет опции 'source' и' target', а также может использоваться для создания файлов классов, совместимых с Java 1.7. Но это может отличаться от действительно компилирования этих классов с помощью компилятора Java 1.7. Вышеизложенное делает то же самое. Если вам действительно нужно (100%) использовать JDK 8, вам нужно пройти путь через плагин maven-enforcer и проверить установленный JDK на версию, которую вы ожидаете. – khmarbaise

Смежные вопросы