Skip to content

Plugin generates corrupted shaded sources beyond recognition #759

@ursaj

Description

@ursaj

Affected version

3.6.0

Bug description

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

<createSourcesJar>true</createSourcesJar>
<shadeSourcesContent>true</shadeSourcesContent>

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("(\\.|/|[^<?:+\\-*/^|&]\\s+)$");

     /**
      * Match <ul>
@@ -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<org.apache.maven.Key, org.apache.maven.Value> 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<com.acme.maven.Key, com.acme.maven.Value> 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"

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