Skip to content

[MASSEMBLY-1026] Assembly plugin 3.7.0 handles scopes wrongly  #1231

@jira-importer

Description

@jira-importer

Filipe Roque opened MASSEMBLY-1026 and commented

maven-assembly-plugin 3.7.0 is not consistent with maven-jar-plugin and maven-dependency-plugin

For the following 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>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>
 

src/main/assembly/descriptor.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>
 

src/main/java/org/example/Foo.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);
    }
} 

 

Maven dependency plugin indicates that guava 16 will be used

❯ /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)

maven-jar-plugin indicates guava 16 will be used

❯ 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 

  

And executing fails due to maven-assembly-plugin assemblying guava 31

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
❯ 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

1 votes, 2 watchers

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions