Я довольно хорошо продвигался по моей дороге к Мейвену , которая была до сегодняшнего дня, когда я пытался сделать объезд.
Мой предпочтительный способ запуска 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. Покиньте дорогу и вы будете наказаны.