apache / apache/maven-shade-plugin

Plugin generates corrupted shaded sources beyond recognition

Open
#759 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
188
Forks
103
Avg merge
16h 39m
Merged PRs (30d)
4

Description

### Affected version

3.6.0

### Bug description

Plugin generates corrupted sources, when the following options are set:
```
true
true
```

Plugin

- ignores math operations
- ignores bitwise operations
- ignores boolean operations
- ignores (return|throw|new|case) Java keywords

Patch
```
Index: src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java b/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java
--- a/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java (revision d18d100fade4b1031e5afff1380e6f243e1cd9c0)
+++ b/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java (date 1759154163759)
@@ -34,7 +34,7 @@
/**
* Match dot, slash or space at end of string
*/
- private static final Pattern RX_ENDS_WITH_DOT_SLASH_SPACE = Pattern.compile("[./ ]$");
+ private static final Pattern RX_ENDS_WITH_DOT_SLASH_SPACE = Pattern.compile("(\\.|/|[^
@@ -46,7 +46,7 @@
* at end of string
*/
private static final Pattern RX_ENDS_WITH_JAVA_KEYWORD = Pattern.compile(
- "\\b(import|package|public|protected|private|static|final|synchronized|abstract|volatile|extends|implements|throws) $"
+ "\\b(import|package|public|protected|private|static|final|synchronized|abstract|volatile|extends|implements|instanceof|throws|throw|return|new|case)\\s$"
+ "|"
+ "\\{@link( \\*)* $"
+ "|"
Index: src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java b/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java
--- a/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java (revision d18d100fade4b1031e5afff1380e6f243e1cd9c0)
+++ b/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java (date 1759154055323)
@@ -208,6 +208,30 @@
+ " /** Javadoc, followed by default visibility method with fully qualified return type */\n"
+ " org.apache.maven.MyReturnType doSomething( org.apache.maven.Bar bar, org.objectweb.asm.sub.Something something) {\n"
+ " org.apache.maven.Bar bar;\n"
+ + " Map map1;\n"
+ + " Map< org.apache.maven.Key, org.apache.maven.Value > map2;\n"
+ + " throw org.apache.maven.Error.newError();\n"
+ + " throw new org.apache.maven.Error();\n"
+ + " boolean flag1 = bar instanceof org.apache.maven.Bar;\n"
+ + " boolean flag2 = org.apache.maven.Utils.yes() ? org.apache.maven.Utils.one() : org.apache.maven.Utils.zero();\n"
+ + " boolean flag3 = org.apache.maven.Utils.yes() || org.apache.maven.Utils.no();\n"
+ + " boolean flag4 = org.apache.maven.Utils.yes() && org.apache.maven.Utils.no();\n"
+ + " boolean flag5 = org.apache.maven.Utils.yes() ^^ org.apache.maven.Utils.no();\n"
+ + " int value1 = org.apache.maven.Utils.x() + org.apache.maven.Utils.y()\n"
+ + " int value2 = org.apache.maven.Utils.x() - org.apache.maven.Utils.y()\n"
+ + " int value3 = org.apache.maven.Utils.x() * org.apache.maven.Utils.y()\n"
+ + " int value4 = org.apache.maven.Utils.x() / org.apache.maven.Utils.y()\n"
+ + " int value5 = org.apache.maven.Utils.one() | org.apache.maven.Utils.two()\n"
+ + " int value6 = org.apache.maven.Utils.one() & org.apache.maven.Utils.two()\n"
+ + " int value7 = org.apache.maven.Utils.one() ^ org.apache.maven.Utils.two()\n"
+ + " switch (org.apache.maven.Utils.getValue()) {\n"
+ + " case org.apache.maven.Utils.STATIC_VALUE:\n"
+ + " org.apache.maven.Utils.info(\"known value\"):\n"
+ + " break;\n"
+ + " default:\n"
+ + " org.apache.maven.Utils.warn(\"unknown value\"):\n"
+ + " break;\n"
+ + " }\n"
+ " org.objectweb.asm.sub.Something something;\n"
+ " String io, val;\n"
+ " String noRelocation = \"NoWordBoundaryXXXorg.apache.maven.In\";\n"
@@ -241,6 +265,30 @@
+ " /** Javadoc, followed by default visibility method with fully qualified return type */\n"
+ " com.acme.maven.MyReturnType doSomething( com.acme.maven.Bar bar, aj.org.objectweb.asm.sub.Something something) {\n"
+ " com.acme.maven.Bar bar;\n"
+ + " Map map1;\n"
+ + " Map< com.acme.maven.Key, com.acme.maven.Value > map2;\n"
+ + " throw com.acme.maven.Error.newError();\n"
+ + " throw new com.acme.maven.Error();\n"
+ + " boolean flag1 = bar instanceof com.acme.maven.Bar;\n"
+ + " boolean flag2 = com.acme.maven.Utils.yes() ? com.acme.maven.Utils.one() : com.acme.maven.Utils.zero();\n"
+ + " boolean flag3 = com.acme.maven.Utils.yes() || com.acme.maven.Utils.no();\n"
+ + " boolean flag4 = com.acme.maven.Utils.yes() && com.acme.maven.Utils.no();\n"
+ + " boolean flag5 = com.acme.maven.Utils.yes() ^^ com.acme.maven.Utils.no();\n"
+ + " int value1 = com.acme.maven.Utils.x() + com.acme.maven.Utils.y()\n"
+ + " int value2 = com.acme.maven.Utils.x() - com.acme.maven.Utils.y()\n"
+ + " int value3 = com.acme.maven.Utils.x() * com.acme.maven.Utils.y()\n"
+ + " int value4 = com.acme.maven.Utils.x() / com.acme.maven.Utils.y()\n"
+ + " int value5 = com.acme.maven.Utils.one() | com.acme.maven.Utils.two()\n"
+ + " int value6 = com.acme.maven.Utils.one() & com.acme.maven.Utils.two()\n"
+ + " int value7 = com.acme.maven.Utils.one() ^ com.acme.maven.Utils.two()\n"
+ + " switch (com.acme.maven.Utils.getValue()) {\n"
+ + " case com.acme.maven.Utils.STATIC_VALUE:\n"
+ + " com.acme.maven.Utils.info(\"known value\"):\n"
+ + " break;\n"
+ + " default:\n"
+ + " com.acme.maven.Utils.warn(\"unknown value\"):\n"
+ + " break;\n"
+ + " }\n"
+ " aj.org.objectweb.asm.sub.Something something;\n"
+ " String io, val;\n"
+ " String noRelocation = \"NoWordBoundaryXXXorg.apache.maven.In\";\n"
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java, especially RX_ENDS_WITH_DOT_SLASH_SPACE and RX_ENDS_WITH_JAVA_KEYWORD. Review the affected source patterns and then run the relocation cases in src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java. Done means shaded sources preserve the listed operators and Java keywords while relocating referenced names correctly.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
build-system
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
62/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.