apache / apache/maven-assembly-plugin

[MASSEMBLY-1026] Assembly plugin 3.7.0 handles scopes wrongly

Open
#1,231 2 comments 2 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
110
Forks
75
Avg merge
12h 54m
Merged PRs (30d)
10

Description

**[Filipe Roque](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=froque)** opened **[MASSEMBLY-1026](https://issues.apache.org/jira/browse/MASSEMBLY-1026?redirect=false)** 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

4.0.0

org.example
assembly-demo
1.0-SNAPSHOT


21
21
UTF-8




org.apache.maven.plugins
maven-jar-plugin
3.3.0



true
org.example.Foo
true


${project.artifactId}



org.apache.maven.plugins
maven-assembly-plugin

3.7.0


src/main/assembly/descriptor.xml

false
${project.artifactId}



package

single







com.fasterxml.jackson.datatype
jackson-datatype-guava
2.7.3
test


com.google.inject
guice
6.0.0


```

**src/main/assembly/descriptor.xml**
 

```xml

assembly

dir

false
.


/
false
runtime




/
target/assembly-demo.jar


```

**src/main/java/org/example/Foo.java**
 

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

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

maven-jar-plugin indicates guava 16 will be used

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

  

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

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

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

---

1 votes, 2 watchers

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the issue with the provided pom.xml, src/main/assembly/descriptor.xml, and src/main/java/org/example/Foo.java, then compare the Maven dependency tree and assembled target/assembly-demo-assembly contents. Done means the assembly resolves the dependency scope consistently with the Maven dependency and JAR plugins and java -jar no longer fails because of the selected Guava version.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.