Это скорее продолжение для этого ответа по ведению номеров родительских версий с помощью заполнителей :
Я нахожусь на Maven 3.6.1 и имеюследующая мультимодульная структура проекта Maven:
pom.xml
a/
pom.xml
b/
pom.xml
pom.xml
(родитель):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>com.tuna</groupId>
<artifactId>root</artifactId>
<version>${ver}</version>
<packaging>pom</packaging>
<modules>
<module>a</module>
<module>b</module>
</modules>
<properties>
<ver>1.0-SNAPSHOT</ver>
</properties>
</project>
a/pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>com.tuna</groupId>
<artifactId>root</artifactId>
<version>${ver}</version>
<relativePath>..</relativePath>
</parent>
<artifactId>a</artifactId>
<version>${ver}</version>
</project>
b/pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>com.tuna</groupId>
<artifactId>root</artifactId>
<version>${ver}</version>
<relativePath>..</relativePath>
</parent>
<artifactId>b</artifactId>
<version>${ver}</version>
<dependencies>
<dependency>
<groupId>com.tuna</groupId>
<artifactId>a</artifactId>
<version>${ver}</version>
</dependency>
</dependencies>
</project>
Обратите внимание, что b
зависит от a
.
Теперь, когда я создаю это с помощью
mvn clean install
, оно создается успешно (с некоторыми 'version' contains an expression but should be a constant
предупреждений - достаточно справедливо).
Однако, если я сделаю
mvn clean install -rf :b
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.tuna:a:jar:1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.tuna:a:${ver}, C:\Users\janaka\code\dustbin\mvn-multi-module\a\pom.xml, line 15, column 14
[WARNING] 'version' contains an expression but should be a constant. @ com.tuna:root:${ver}, C:\Users\janaka\code\dustbin\mvn-multi-module\pom.xml, line 9, column 14
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.tuna:b:jar:1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.tuna:b:${ver}, C:\Users\janaka\code\dustbin\mvn-multi-module\b\pom.xml, line 15, column 14
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.tuna:root:pom:1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.tuna:root:${ver}, C:\Users\janaka\code\dustbin\mvn-multi-module\pom.xml, line 9, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -----------------------------< com.tuna:b >-----------------------------
[INFO] Building b 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.472 s
[INFO] Finished at: 2019-10-09T00:08:14+05:30
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project b: Could not resolve dependencies for project com.tuna:b:jar:1.0-SNAPSHOT: Failed to collect dependencies at com.tuna:a:jar:1.0-SNAPSHOT: Failed to read artifact descriptor for com.tuna:a:jar:1.0-SNAPSHOT: Cannot access central (https://repo.maven.apache.org/maven2) in offline mode and the artifact com.tuna:root:pom:${ver} has not been downloaded from it before. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
То же самое произойдет, если я буду запускать mvn clean install
из b/
.
Очевидно Maven может разрешить ${ver}
для b
и a
, но когда он сканирует POM a
, он не может разрешить a
родительский ${ver}
версия (хотя есть запись relativePath
);вероятно, потому что Maven читает POM a
из локального репозитория (~/.m2/repository/
- где относительный путь не имеет смысла), а не из локальной кодовой базы?
Есть ли способ получить этоработать - избежать ошибок и заставить работать частичные сборки - возможно, с помощью некоторого взлома;как передача значения по умолчанию для ${ver}
через системное свойство?
PS:
Да, да, я знаю, что все вонючие и злые использовать заполнители в родительской версииномер;но мой настоящий проект имеет около 30 модулей, многие из которых взаимозависимы с другими. Поэтому я просто хочу сохранить один номер версии (одну строку), который я могу легко изменить - без необходимости изменять и фиксировать пару сотен строк при каждом обновлении.
По сути, я не прошупредлагает вместо этого реплицировать номер версии повсеместно (и использовать что-то вроде плагина версий Maven для их одновременного обновления) - мне просто нужен взлом, чтобы заставить работать текущую структуру.
(так что я верю в этоне может быть помечен как дубликат, потому что репликация и заполнители - единственные два варианта, с которыми я столкнулся в SO, и мой вопрос касается конкретного случая последнего. ?)