Filipe Roque created MASSEMBLY-1026:
---------------------------------------
             Summary: 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


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}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to