Skip to content

Plugin generates corrupted shaded sources beyond recognition #759

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"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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