Статьи

Объезд на дороге в Мейвен

Я довольно хорошо продвигался по моей дороге к Мейвену , которая была до сегодняшнего дня, когда я пытался сделать объезд.

Мой предпочтительный способ запуска Java-приложения — создать путь к классу, используя средство сравнения файлов lib / *. Jar. Maven упрощает настройку моей директории lib со всеми зависимыми банками проекта, используя плагин Maven Dependency :

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-to-lib</id>
      <phase>package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${lib.dir}</outputDirectory>
        <includeScope>compile</includeScope>
        <includeScope>runtime</includeScope>
      </configuration>
    </execution>
  </executions>
</plugin>

В сотрудничестве с плагином Maven Ant, который копирует jar приложения:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-jar</id>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <copy
            file="${project.build.directory}/${project.build.finalName}.jar"
            toDir="${lib.dir}" />
        </tasks>
      </configuration>
    </execution>
    <execution>
      <id>clean</id>
      <phase>clean</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <delete dir="${lib.dir}" />
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

(а также выполняет чистку)

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

Я использую Eclipse и m2e, и я решил сэкономить время, изменив выходную папку по умолчанию Eclipse на lib / myapp.jar (да, это папка, а не jar, называемая myapp.jar), и это избавит от необходимости запускать Maven после каждого изменения кода, которое я хотел увидеть в своем приложении.

К сожалению, изменение папки вывода было слишком коротким путем для m2e, и это наказало меня, удалив классы приложений из пути к классам, чтобы я больше не мог запускать какие-либо тесты из Eclipse. Прошёл час утомительных попыток, прежде чем я наткнулся на ответ в билете Jira . m2e игнорирует параметр eclipse для выходной папки при создании конфигурации запуска и независимо использует папку назначения / классов по умолчанию.

Мне не нужен m2e! Я просто использую стандартный проект Eclipse и вручную добавлю содержимое моего каталога lib в путь к классам. Конечно, я забыл тесты. То, что мне нужно, сказал мой муравей, это цель с двумя задачами. Один из них копирует зависимости области компиляции и среды выполнения в каталог lib, а другой — копии тестовой зависимости области в каталог test / lib.

Одна цель — две конфигурации в Maven? Maven говорит нет. Единственный способ — использовать профили. Похоже на это.

<profiles>
  <profile>
    <id>copy-to-lib</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <configuration>
            <outputDirectory>${lib.dir}</outputDirectory>
            <includeScope>compile</includeScope>
            <includeScope>runtime</includeScope>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>copy-to-test</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <configuration>
            <outputDirectory>${test.lib.dir}</outputDirectory>
            <includeScope>test</includeScope>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

Которые запускаются с зависимостью mvn: copy-dependencies -Pcopy-to-lib с последующей зависимостью mvn: copy-dependencies -Pcopy-to-test.

Пока все хорошо, за исключением того, что копирование в тест копирует слишком много из-за транзитивных зависимостей и с <excludeTransitive> true </ excludeTransitive> копирует слишком мало!

К настоящему времени я провел большую часть дня, потерянного в джунглях Maven, и мне просто нужно сократить свои потери и вернуться на правильный путь. Снова на дороге. Через несколько минут я изменил путь к классу приложения на target / classes: target / lib / *. Jar и вернулся к m2e, удалив проект eclipse (но не исходный код) и .classpath и. Файлы проекта и используется Файл -> Импорт -> ExistingMavenProject. Сейф снова.

Я узнаю, что Конвенция над Конфигурацией означает соответствие, а соответствие означает, что вы должны изучить правила. Невежество не оправдание в глазах Maven. Покиньте дорогу и вы будете наказаны.