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
index 9d49f77ab..a95ad8a65 100644
--- a/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java
+++ b/src/main/java/org/apache/maven/plugins/shade/relocation/SimpleRelocator.java
@@ -32,9 +32,12 @@
*/
public class SimpleRelocator implements Relocator {
/**
- * Match dot, slash or space at end of string
+ * Matches
+ * - either dot,
+ * - or space at the end of a string, where string does NOT end with operator (generic type, binary, trinary).
+ *
*/
- private static final Pattern RX_ENDS_WITH_DOT_SLASH_SPACE = Pattern.compile("[./ ]$");
+ private static final Pattern RX_ENDS_WITH_DOT_OR_SPACE_WITHOUT_OPERATOR = Pattern.compile("(\\.|[^<>?:+\\-*/^|&] )$");
/**
* Match
@@ -46,7 +49,7 @@ public class SimpleRelocator implements Relocator {
* 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) $"
+ "|"
+ "\\{@link( \\*)* $"
+ "|"
@@ -243,7 +246,7 @@ private String shadeSourceWithExcludes(
isFirstSnippet = false;
} else {
String previousSnippetOneLine = previousSnippet.replaceAll("\\s+", " ");
- boolean afterDotSlashSpace = RX_ENDS_WITH_DOT_SLASH_SPACE
+ boolean afterDotSlashSpace = RX_ENDS_WITH_DOT_OR_SPACE_WITHOUT_OPERATOR
.matcher(previousSnippetOneLine)
.find();
boolean afterJavaKeyWord = RX_ENDS_WITH_JAVA_KEYWORD
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
index 9f7c29d48..11109e6c2 100644
--- a/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java
+++ b/src/test/java/org/apache/maven/plugins/shade/relocation/SimpleRelocatorTest.java
@@ -208,6 +208,68 @@ public void testRelocateMavenFiles() {
+ " /** 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"
+ + " org.apache.maven.Map map1;\n"
+ + " org.apache.maven.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 flag11 = org.apache.maven.Utils.yes() ? org.apache.maven.Utils.one() : org.apache.maven.Utils.zero() ; \n"
+ + " boolean flag12 = org.apache.maven.Utils.yes() || org.apache.maven.Utils.no() ; \n"
+ + " boolean flag13 = org.apache.maven.Utils.yes() && org.apache.maven.Utils.no() ; \n"
+
+ + " boolean flag21=org.apache.maven.Utils.yes()?org.apache.maven.Utils.one():org.apache.maven.Utils.zero();\n"
+ + " boolean flag22=org.apache.maven.Utils.yes()||org.apache.maven.Utils.no();\n"
+ + " boolean flag23=org.apache.maven.Utils.yes()&&org.apache.maven.Utils.no();\n"
+
+ + " boolean flag31 = org.apache.maven.Utils.yes ? org.apache.maven.Utils.one : org.apache.maven.Utils.zero ; \n"
+ + " boolean flag32 = org.apache.maven.Utils.yes || org.apache.maven.Utils.no ; \n"
+ + " boolean flag33 = org.apache.maven.Utils.yes && org.apache.maven.Utils.no ; \n"
+
+ + " boolean flag41=org.apache.maven.Utils.yes?org.apache.maven.Utils.one:org.apache.maven.Utils.zero;\n"
+ + " boolean flag42=org.apache.maven.Utils.yes||org.apache.maven.Utils.no;\n"
+ + " boolean flag43=org.apache.maven.Utils.yes&&org.apache.maven.Utils.no;\n"
+
+ + " int value11 = org.apache.maven.Utils.x() + org.apache.maven.Utils.y() ; \n"
+ + " int value12 = org.apache.maven.Utils.x() - org.apache.maven.Utils.y() ; \n"
+ + " int value13 = org.apache.maven.Utils.x() * org.apache.maven.Utils.y() ; \n"
+ + " int value14 = org.apache.maven.Utils.x() / org.apache.maven.Utils.y() ; \n"
+ + " int value15 = org.apache.maven.Utils.one() | org.apache.maven.Utils.two() ; \n"
+ + " int value16 = org.apache.maven.Utils.one() & org.apache.maven.Utils.two() ; \n"
+ + " int value17 = org.apache.maven.Utils.one() ^ org.apache.maven.Utils.two() ; \n"
+
+ + " int value21=org.apache.maven.Utils.x()+org.apache.maven.Utils.y();\n"
+ + " int value22=org.apache.maven.Utils.x()-org.apache.maven.Utils.y();\n"
+ + " int value23=org.apache.maven.Utils.x()*org.apache.maven.Utils.y();\n"
+ + " int value24=org.apache.maven.Utils.x()/org.apache.maven.Utils.y();\n"
+ + " int value25=org.apache.maven.Utils.one()|org.apache.maven.Utils.two();\n"
+ + " int value26=org.apache.maven.Utils.one()&org.apache.maven.Utils.two();\n"
+ + " int value27=org.apache.maven.Utils.one()^org.apache.maven.Utils.two();\n"
+
+ + " int value31 = org.apache.maven.Utils.x + org.apache.maven.Utils.y ; \n"
+ + " int value32 = org.apache.maven.Utils.x - org.apache.maven.Utils.y ; \n"
+ + " int value33 = org.apache.maven.Utils.x * org.apache.maven.Utils.y ; \n"
+ + " int value34 = org.apache.maven.Utils.x / org.apache.maven.Utils.y ; \n"
+ + " int value35 = org.apache.maven.Utils.one | org.apache.maven.Utils.two ; \n"
+ + " int value36 = org.apache.maven.Utils.one & org.apache.maven.Utils.two ; \n"
+ + " int value37 = org.apache.maven.Utils.one ^ org.apache.maven.Utils.two ; \n"
+
+ + " int value41=org.apache.maven.Utils.x+org.apache.maven.Utils.y;\n"
+ + " int value42=org.apache.maven.Utils.x-org.apache.maven.Utils.y;\n"
+ + " int value43=org.apache.maven.Utils.x*org.apache.maven.Utils.y;\n"
+ + " int value44=org.apache.maven.Utils.x/org.apache.maven.Utils.y;\n"
+ + " int value45=org.apache.maven.Utils.one|org.apache.maven.Utils.two;\n"
+ + " int value46=org.apache.maven.Utils.one&org.apache.maven.Utils.two;\n"
+ + " int value47=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 +303,68 @@ public void testRelocateMavenFiles() {
+ " /** 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"
+ + " com.acme.maven.Map map1;\n"
+ + " com.acme.maven.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 flag11 = com.acme.maven.Utils.yes() ? com.acme.maven.Utils.one() : com.acme.maven.Utils.zero() ; \n"
+ + " boolean flag12 = com.acme.maven.Utils.yes() || com.acme.maven.Utils.no() ; \n"
+ + " boolean flag13 = com.acme.maven.Utils.yes() && com.acme.maven.Utils.no() ; \n"
+
+ + " boolean flag21=com.acme.maven.Utils.yes()?com.acme.maven.Utils.one():com.acme.maven.Utils.zero();\n"
+ + " boolean flag22=com.acme.maven.Utils.yes()||com.acme.maven.Utils.no();\n"
+ + " boolean flag23=com.acme.maven.Utils.yes()&&com.acme.maven.Utils.no();\n"
+
+ + " boolean flag31 = com.acme.maven.Utils.yes ? com.acme.maven.Utils.one : com.acme.maven.Utils.zero ; \n"
+ + " boolean flag32 = com.acme.maven.Utils.yes || com.acme.maven.Utils.no ; \n"
+ + " boolean flag33 = com.acme.maven.Utils.yes && com.acme.maven.Utils.no ; \n"
+
+ + " boolean flag41=com.acme.maven.Utils.yes?com.acme.maven.Utils.one:com.acme.maven.Utils.zero;\n"
+ + " boolean flag42=com.acme.maven.Utils.yes||com.acme.maven.Utils.no;\n"
+ + " boolean flag43=com.acme.maven.Utils.yes&&com.acme.maven.Utils.no;\n"
+
+ + " int value11 = com.acme.maven.Utils.x() + com.acme.maven.Utils.y() ; \n"
+ + " int value12 = com.acme.maven.Utils.x() - com.acme.maven.Utils.y() ; \n"
+ + " int value13 = com.acme.maven.Utils.x() * com.acme.maven.Utils.y() ; \n"
+ + " int value14 = com.acme.maven.Utils.x() / com.acme.maven.Utils.y() ; \n"
+ + " int value15 = com.acme.maven.Utils.one() | com.acme.maven.Utils.two() ; \n"
+ + " int value16 = com.acme.maven.Utils.one() & com.acme.maven.Utils.two() ; \n"
+ + " int value17 = com.acme.maven.Utils.one() ^ com.acme.maven.Utils.two() ; \n"
+
+ + " int value21=com.acme.maven.Utils.x()+com.acme.maven.Utils.y();\n"
+ + " int value22=com.acme.maven.Utils.x()-com.acme.maven.Utils.y();\n"
+ + " int value23=com.acme.maven.Utils.x()*com.acme.maven.Utils.y();\n"
+ + " int value24=com.acme.maven.Utils.x()/com.acme.maven.Utils.y();\n"
+ + " int value25=com.acme.maven.Utils.one()|com.acme.maven.Utils.two();\n"
+ + " int value26=com.acme.maven.Utils.one()&com.acme.maven.Utils.two();\n"
+ + " int value27=com.acme.maven.Utils.one()^com.acme.maven.Utils.two();\n"
+
+ + " int value31 = com.acme.maven.Utils.x + com.acme.maven.Utils.y ; \n"
+ + " int value32 = com.acme.maven.Utils.x - com.acme.maven.Utils.y ; \n"
+ + " int value33 = com.acme.maven.Utils.x * com.acme.maven.Utils.y ; \n"
+ + " int value34 = com.acme.maven.Utils.x / com.acme.maven.Utils.y ; \n"
+ + " int value35 = com.acme.maven.Utils.one | com.acme.maven.Utils.two ; \n"
+ + " int value36 = com.acme.maven.Utils.one & com.acme.maven.Utils.two ; \n"
+ + " int value37 = com.acme.maven.Utils.one ^ com.acme.maven.Utils.two ; \n"
+
+ + " int value41=com.acme.maven.Utils.x+com.acme.maven.Utils.y;\n"
+ + " int value42=com.acme.maven.Utils.x-com.acme.maven.Utils.y;\n"
+ + " int value43=com.acme.maven.Utils.x*com.acme.maven.Utils.y;\n"
+ + " int value44=com.acme.maven.Utils.x/com.acme.maven.Utils.y;\n"
+ + " int value45=com.acme.maven.Utils.one|com.acme.maven.Utils.two;\n"
+ + " int value46=com.acme.maven.Utils.one&com.acme.maven.Utils.two;\n"
+ + " int value47=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"