[ 
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)

Reply via email to