[
https://issues.apache.org/jira/browse/MASSEMBLY-1026?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Filipe Roque updated MASSEMBLY-1026:
------------------------------------
Description:
maven-assembly-plugin 3.7.0 is not consistent with maven-jar-plugin and
maven-dependency-plugin
For the following *pom.xml*
{code: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>org.example</groupId>
<artifactId>assembly-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.example.Foo</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- <version>3.6.0</version>-->
<version>3.7.0</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
<attach>false</attach>
<finalName>${project.artifactId}</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>6.0.0</version>
</dependency>
</dependencies>
</project>
{code}
*src/main/assembly/descriptor.xml*
{code:xml}
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>assembly</id>
<formats>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<baseDirectory>.</baseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<files>
<file>
<outputDirectory>/</outputDirectory>
<source>target/assembly-demo.jar</source>
</file>
</files>
</assembly>
{code}
*src/main/java/org/example/Foo.java*
{code:java}
package org.example;
public class Foo {
public static void main(String[] args) {
// CheckedFuture was removed in Guava 28
System.out.println(com.google.common.util.concurrent.CheckedFuture.class);
}
}
{code}
Maven dependency plugin indicates that guava 16 will be used
{code:bash}
❯ /opt/maven/apache-maven-3.9.5/bin/mvn -q dependency:tree -Dverbose
-Dincludes=com.google.guava:guava -DoutputFile=tree.txt; cat tree.txt
org.example:assembly-demo:jar:1.0-SNAPSHOT
+- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.7.3:test
| \- com.google.guava:guava:jar:16.0:compile
\- com.google.inject:guice:jar:6.0.0:compile
\- (com.google.guava:guava:jar:31.0.1-jre:compile - omitted for conflict
with 16.0)
{code}
maven-jar-plugin indicates guava 16 will be used
{code:bash}
❯ unzip -q -c target/assembly-demo-assembly/assembly-demo.jar
META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 21
Class-Path: guava-16.0.jar guice-6.0.0.jar javax.inject-1.jar jakarta.in
ject-api-2.0.1.jar aopalliance-1.0.jar
Implementation-Title: assembly-demo
Implementation-Version: 1.0-SNAPSHOT
Main-Class: org.example.Foo
{code}
And executing fails due to maven-assembly-plugin assemblying guava 31
{code:java}
❯ java -jar target/assembly-demo-assembly/assembly-demo.jar
Exception in thread "main" java.lang.NoClassDefFoundError:
com/google/common/util/concurrent/CheckedFuture
at org.example.Foo.main(Foo.java:7)
Caused by: java.lang.ClassNotFoundException:
com.google.common.util.concurrent.CheckedFuture
at
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 1 more
{code}
{code:bash}
❯ ls -1 target/assembly-demo-assembly/
aopalliance-1.0.jar
assembly-demo.jar
checker-qual-3.12.0.jar
error_prone_annotations-2.7.1.jar
failureaccess-1.0.1.jar
guava-31.0.1-jre.jar
guice-6.0.0.jar
j2objc-annotations-1.3.jar
jakarta.inject-api-2.0.1.jar
javax.inject-1.jar
jsr305-3.0.2.jar
listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
{code}
was:
Maven 3.7.0 is not consistent with maven-jar-plugin and maven-dependency-plugin
For the following *pom.xml*
{code: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>org.example</groupId>
<artifactId>assembly-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.example.Foo</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- <version>3.6.0</version>-->
<version>3.7.0</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
<attach>false</attach>
<finalName>${project.artifactId}</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>6.0.0</version>
</dependency>
</dependencies>
</project>
{code}
*src/main/assembly/descriptor.xml*
{code:xml}
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>assembly</id>
<formats>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<baseDirectory>.</baseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<files>
<file>
<outputDirectory>/</outputDirectory>
<source>target/assembly-demo.jar</source>
</file>
</files>
</assembly>
{code}
*src/main/java/org/example/Foo.java*
{code:java}
package org.example;
public class Foo {
public static void main(String[] args) {
// CheckedFuture was removed in Guava 28
System.out.println(com.google.common.util.concurrent.CheckedFuture.class);
}
}
{code}
Maven dependency plugin indicates that guava 16 will be used
{code:bash}
❯ /opt/maven/apache-maven-3.9.5/bin/mvn -q dependency:tree -Dverbose
-Dincludes=com.google.guava:guava -DoutputFile=tree.txt; cat tree.txt
org.example:assembly-demo:jar:1.0-SNAPSHOT
+- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.7.3:test
| \- com.google.guava:guava:jar:16.0:compile
\- com.google.inject:guice:jar:6.0.0:compile
\- (com.google.guava:guava:jar:31.0.1-jre:compile - omitted for conflict
with 16.0)
{code}
maven-jar-plugin indicates guava 16 will be used
{code:bash}
❯ unzip -q -c target/assembly-demo-assembly/assembly-demo.jar
META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 21
Class-Path: guava-16.0.jar guice-6.0.0.jar javax.inject-1.jar jakarta.in
ject-api-2.0.1.jar aopalliance-1.0.jar
Implementation-Title: assembly-demo
Implementation-Version: 1.0-SNAPSHOT
Main-Class: org.example.Foo
{code}
And executing fails due to maven-assembly-plugin assemblying guava 31
{code:java}
❯ java -jar target/assembly-demo-assembly/assembly-demo.jar
Exception in thread "main" java.lang.NoClassDefFoundError:
com/google/common/util/concurrent/CheckedFuture
at org.example.Foo.main(Foo.java:7)
Caused by: java.lang.ClassNotFoundException:
com.google.common.util.concurrent.CheckedFuture
at
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 1 more
{code}
{code:bash}
❯ ls -1 target/assembly-demo-assembly/
aopalliance-1.0.jar
assembly-demo.jar
checker-qual-3.12.0.jar
error_prone_annotations-2.7.1.jar
failureaccess-1.0.1.jar
guava-31.0.1-jre.jar
guice-6.0.0.jar
j2objc-annotations-1.3.jar
jakarta.inject-api-2.0.1.jar
javax.inject-1.jar
jsr305-3.0.2.jar
listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
{code}
> Assembly plugin 3.7.0 handles scopes wrongly
> ---------------------------------------------
>
> Key: MASSEMBLY-1026
> URL: https://issues.apache.org/jira/browse/MASSEMBLY-1026
> Project: Maven Assembly Plugin
> Issue Type: Bug
> Reporter: Filipe Roque
> Priority: Major
>
> maven-assembly-plugin 3.7.0 is not consistent with maven-jar-plugin and
> maven-dependency-plugin
> For the following *pom.xml*
> {code: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>org.example</groupId>
> <artifactId>assembly-demo</artifactId>
> <version>1.0-SNAPSHOT</version>
> <properties>
> <maven.compiler.source>21</maven.compiler.source>
> <maven.compiler.target>21</maven.compiler.target>
> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
> </properties>
> <build>
> <plugins>
> <plugin>
> <groupId>org.apache.maven.plugins</groupId>
> <artifactId>maven-jar-plugin</artifactId>
> <version>3.3.0</version>
> <configuration>
> <archive>
> <manifest>
> <addClasspath>true</addClasspath>
> <mainClass>org.example.Foo</mainClass>
>
> <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
> </manifest>
> </archive>
> <finalName>${project.artifactId}</finalName>
> </configuration>
> </plugin>
> <plugin>
> <groupId>org.apache.maven.plugins</groupId>
> <artifactId>maven-assembly-plugin</artifactId>
> <!-- <version>3.6.0</version>-->
> <version>3.7.0</version>
> <configuration>
> <descriptors>
> <descriptor>src/main/assembly/descriptor.xml</descriptor>
> </descriptors>
> <attach>false</attach>
> <finalName>${project.artifactId}</finalName>
> </configuration>
> <executions>
> <execution>
> <phase>package</phase>
> <goals>
> <goal>single</goal>
> </goals>
> </execution>
> </executions>
> </plugin>
> </plugins>
> </build>
> <dependencies>
> <dependency>
> <groupId>com.fasterxml.jackson.datatype</groupId>
> <artifactId>jackson-datatype-guava</artifactId>
> <version>2.7.3</version>
> <scope>test</scope>
> </dependency>
> <dependency>
> <groupId>com.google.inject</groupId>
> <artifactId>guice</artifactId>
> <version>6.0.0</version>
> </dependency>
> </dependencies>
> </project>
> {code}
> *src/main/assembly/descriptor.xml*
>
> {code:xml}
> <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
> http://maven.apache.org/xsd/assembly-2.1.0.xsd">
> <id>assembly</id>
> <formats>
> <format>dir</format>
> </formats>
> <includeBaseDirectory>false</includeBaseDirectory>
> <baseDirectory>.</baseDirectory>
> <dependencySets>
> <dependencySet>
> <outputDirectory>/</outputDirectory>
> <useProjectArtifact>false</useProjectArtifact>
> <scope>runtime</scope>
> </dependencySet>
> </dependencySets>
> <files>
> <file>
> <outputDirectory>/</outputDirectory>
> <source>target/assembly-demo.jar</source>
> </file>
> </files>
> </assembly>
> {code}
> *src/main/java/org/example/Foo.java*
>
> {code:java}
> package org.example;
> public class Foo {
> public static void main(String[] args) {
> // CheckedFuture was removed in Guava 28
>
> System.out.println(com.google.common.util.concurrent.CheckedFuture.class);
> }
> }
> {code}
>
> Maven dependency plugin indicates that guava 16 will be used
> {code:bash}
> ❯ /opt/maven/apache-maven-3.9.5/bin/mvn -q dependency:tree -Dverbose
> -Dincludes=com.google.guava:guava -DoutputFile=tree.txt; cat tree.txt
> org.example:assembly-demo:jar:1.0-SNAPSHOT
> +- com.fasterxml.jackson.datatype:jackson-datatype-guava:jar:2.7.3:test
> | \- com.google.guava:guava:jar:16.0:compile
> \- com.google.inject:guice:jar:6.0.0:compile
> \- (com.google.guava:guava:jar:31.0.1-jre:compile - omitted for conflict
> with 16.0)
> {code}
> maven-jar-plugin indicates guava 16 will be used
> {code:bash}
> ❯ unzip -q -c target/assembly-demo-assembly/assembly-demo.jar
> META-INF/MANIFEST.MF
> Manifest-Version: 1.0
> Created-By: Maven JAR Plugin 3.3.0
> Build-Jdk-Spec: 21
> Class-Path: guava-16.0.jar guice-6.0.0.jar javax.inject-1.jar jakarta.in
> ject-api-2.0.1.jar aopalliance-1.0.jar
> Implementation-Title: assembly-demo
> Implementation-Version: 1.0-SNAPSHOT
> Main-Class: org.example.Foo
> {code}
>
> And executing fails due to maven-assembly-plugin assemblying guava 31
> {code:java}
> ❯ java -jar target/assembly-demo-assembly/assembly-demo.jar
> Exception in thread "main" java.lang.NoClassDefFoundError:
> com/google/common/util/concurrent/CheckedFuture
> at org.example.Foo.main(Foo.java:7)
> Caused by: java.lang.ClassNotFoundException:
> com.google.common.util.concurrent.CheckedFuture
> at
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
> at
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
> ... 1 more
> {code}
> {code:bash}
> ❯ ls -1 target/assembly-demo-assembly/
> aopalliance-1.0.jar
> assembly-demo.jar
> checker-qual-3.12.0.jar
> error_prone_annotations-2.7.1.jar
> failureaccess-1.0.1.jar
> guava-31.0.1-jre.jar
> guice-6.0.0.jar
> j2objc-annotations-1.3.jar
> jakarta.inject-api-2.0.1.jar
> javax.inject-1.jar
> jsr305-3.0.2.jar
> listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)