Как maven решает, когда использовать целевую папку для classpath - PullRequest
0 голосов
/ 11 мая 2018

У меня есть вопрос относительно того, как 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"

Итак, вот пункты, которые я хочу понять:

  1. Почему цель компиляции работает, но не сгенерированы источники генерации?
  2. В какой момент maven решает использовать выходную папку предыдущих проектов на пути к классам реакторов вместо того, чтобы искатьдля jar?
  3. Есть ли способ генерировать исходники напрямую, как я хочу, ДАЖЕ БЕЗ разрешения его зависимостей?

Относительно (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

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Maven может ссылаться только на выходные данные, сгенерированные в текущем сеансе (во время выполнения команды оболочки).Он использует наиболее «зрелое» место для поиска «выходных данных»:

  • Если выполняется compile - классы попадают в каталог traget/classes, поэтому другие модули могут ссылаться на это
  • Если выполняется package - тогда создается target/*.jar, и вместо этого он попадает в путь к классам
  • Если выполняется install - тогда файл jar заканчивается в локальном хранилище - чтоэто то, что заканчивается на пути к классам

Итак, есть 3 фактора, которые препятствуют вашей задаче:

  • maven-exec-plugin требует разрешения зависимостей (как указано @mondaka)
  • Ваш модуль1 ссылается на модуль2
  • generate-sources, выполняемый до компиляции.Таким образом, модуль 2 еще не подготовлен для использования в качестве зависимости.

Так что если вы хотите сделать это по-своему - вам придется запускать по крайней мере compile этап каждый раз, когда вы используете что-либо изЖизненный цикл по умолчанию.Или вы можете написать свой собственный плагин, который не требует разрешения зависимостей.

0 голосов
/ 20 мая 2018

Эта проблема связана с открытой ошибкой maven:

https://issues.apache.org/jira/browse/MNG-3283

Проблема гласит: «Проблема возникает только тогда, когда плагин связывает себя с фазой создания источников и имеет@requiresDependencyResolution ".

Я проверил, что exec-maven-plugin Mojo действительно requiresDependencyResolution = ResolutionScope.TEST.Вы можете видеть, что в https://github.com/mojohaus/exec-maven-plugin/blob/master/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java

Тогда единственный вариант - использовать фазы классов компиляции или процесса.Это основная ошибка 2007 года ...

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