У меня есть вопрос относительно того, как maven вычисляет путь к классу во время сборки.В частности, что контролирует, когда используется «target / classes» и когда используется «jar» из репозитория (локального / удаленного).
У меня есть проект на версии 1.0.0-SNAPSHOT, где артефактыНЕ были установлены / развернуты, поэтому в некоторых репозиториях (удаленных или локальных) нет «jar» для их разрешения.Я хочу запустить "generate-sources" БЕЗ установки локально (без запуска mvn install
).
Структура выглядит следующим образом:
parent-prj
parent-prj/sub-prj
parent-prj/gen-src-prj <--- This depends on 'sub-prj'
Когда я запускаю "mvn -am -pl parent-prj/gen-src-prj generate-sources
«для того, чтобы просто сгенерировать некоторые java-файлы, это не работает:
[ERROR] Failed to execute goal on project gen-src-prj: Could
not resolve dependencies for project
mygrp:gen-src-prj:jar:1.0.0-SNAPSHOT:
Could not find artifact
mygrp:sub-prj:jar:1.0.0-SNAPSHOT -> [Help 1]
Использование вывода отладки и добавление« dependency: build-classpath »Я могу подтвердить, что maven игнорирует присутствие« sub-prj »в реакторе и ищет «банку» где-то, что он не может найти.И все же проект напечатан в кратком описании реактора:
[INFO] Reactor Summary:
[INFO]
[INFO] parent-prj ..................................... SUCCESS [ 0.625 s]
[INFO] sub-prj ........................................ SUCCESS [ 0.018 s]
[INFO] gen-src-prj .................................... FAILURE [ 0.040 s]
Интересно, что я заметил, что выполнение цели компиляции работает отлично!Он использует sub-prj/target/classes
(как показано в зависимости: build-classpath) и без проблем генерирует источники и даже компилирует их: "mvn -am -pl parent-prj/gen-src-prj compile
"
Итак, вот пункты, которые я хочу понять:
- Почему цель компиляции работает, но не сгенерированы источники генерации?
- В какой момент maven решает использовать выходную папку предыдущих проектов на пути к классам реакторов вместо того, чтобы искатьдля jar?
- Есть ли способ генерировать исходники напрямую, как я хочу, ДАЖЕ БЕЗ разрешения его зависимостей?
Относительно (3) мой инструмент генерации являетсяУтилита, вызываемая:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
Инструмент читает некоторый XML в src / main / resources и генерирует файлы Java, и ему НЕ требуется ничего в своем пути к классам (поэтому maven не требует его для разрешения).
Также обратите внимание, что мне было бы интересно понять (1) и (2), даже если будет предоставлено решение для (3).
РЕДАКТИРОВАТЬ: По запросу комментария, добавивполный пример
parent-prj / pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mygrp</groupId>
<artifactId>parent-prj</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>sub-prj</module>
<module>gen-src-prj</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.9</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
parent-prj / sub-prj / pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>mygrp</groupId>
<artifactId>parent-prj</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>sub-prj</artifactId>
</project>
parent-prj / gen-src-prj / pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>mygrp</groupId>
<artifactId>parent-prj</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>gen-src-prj</artifactId>
<dependencies>
<dependency>
<groupId>mygrp</groupId>
<artifactId>sub-prj</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<includeProjectDependencies>false</includeProjectDependencies>
<includePluginDependencies>true</includePluginDependencies>
<mainClass>uk.co.real_logic.sbe.SbeTool</mainClass>
<systemProperties>
<systemProperty>
<key>sbe.output.dir</key>
<value>${project.build.directory}/generated-sources/java</value>
</systemProperty>
<systemProperty>
<key>sbe.validation.warnings.fatal</key>
<value>true</value>
</systemProperty>
</systemProperties>
<arguments>
<argument>${project.build.resources[0].directory}/Examples.xml</argument>
</arguments>
<workingDirectory>${project.build.directory}/generated-sources/java</workingDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>uk.co.real-logic</groupId>
<artifactId>sbe-tool</artifactId>
<version>1.7.10</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>target/generated-sources/java/</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
РЕДАКТИРОВАТЬ: вооружившись знаниями из ответов, я нашел этот обходной путь, который позволяет достичь желаемого поведения.Я перечисляю зависимости в профиле, который активен по умолчанию, а затем использую другой профиль для запуска generate-sources без активных зависимостей, как показано ниже:
parent-prj / gen-src-prj / pom.xml
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<dependencies>
<dependency>
<groupId>mygrp</groupId>
<artifactId>sub-prj</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>excludeDependency</id>
<dependencies>
</dependencies>
</profile>
</profiles>
Для генерации источников с вышеприведенным, используйте: mvn -PexcludeDependency generate-sources