You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ad...@apache.org on 2021/09/05 18:25:50 UTC

[maven-pmd-plugin] branch master updated (995edef -> 3ffd4d3)

This is an automated email from the ASF dual-hosted git repository.

adangel pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git.


    from 995edef  (doc) Add example "Using a different ruleset for tests"
     new 5ae53f1  [MPMD-283] Create a real aggregate goal
     new 3ffd4d3  [MPMD-308] Set Maven 3.1.0 as minimum version

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            |  26 +--
 .../invoker.properties                             |   1 +
 .../module-a/pom.xml                               |   4 +-
 .../module-a/src/main/java/module/a/IModuleA.java  |   0
 .../module-a/src/main/java/module/a/ModuleA.java   |   0
 .../module-b/pom.xml                               |   6 +-
 .../module-b/src/main/java/module/b/ModuleB.java   |   0
 .../pom.xml                                        |  23 ++-
 .../ruleset.xml                                    |   2 +-
 .../verify.groovy                                  |  37 +++-
 src/it/multi-module/pom.xml                        |   8 +
 .../maven/plugins/pmd/AbstractPmdReport.java       |  76 ++++++-
 .../plugins/pmd/AbstractPmdViolationCheckMojo.java |  11 +-
 .../maven/plugins/pmd/AggregatorCpdReport.java}    |  29 +--
 .../pmd/AggregatorCpdViolationCheckMojo.java}      |  28 +--
 .../plugins/pmd/AggregatorPmdNoForkReport.java}    |  21 +-
 .../{PmdFileInfo.java => AggregatorPmdReport.java} |  58 ++----
 .../pmd/AggregatorPmdViolationCheckMojo.java}      |  28 +--
 .../org/apache/maven/plugins/pmd/CpdReport.java    |   9 +-
 .../maven/plugins/pmd/CpdViolationCheckMojo.java   |   2 +-
 .../org/apache/maven/plugins/pmd/PmdReport.java    |  12 +-
 .../maven/plugins/pmd/PmdViolationCheckMojo.java   |   2 +-
 src/site/apt/examples/aggregate.apt.vm             | 219 +++++++++++++++++++++
 src/site/apt/examples/javascriptReport.apt.vm      |   7 +
 src/site/apt/examples/jspReport.apt.vm             |   7 +
 src/site/apt/examples/multi-module-config.apt.vm   |   7 +
 src/site/apt/examples/removeReport.apt.vm          |  10 +-
 src/site/apt/index.apt.vm                          |  32 ++-
 src/site/apt/usage.apt.vm                          |  18 +-
 src/site/fml/faq.fml                               |   6 +
 src/site/site.xml                                  |   1 +
 .../plugins/pmd/CpdViolationCheckMojoTest.java     |  15 +-
 .../apache/maven/plugins/pmd/PmdReportTest.java    |  10 +-
 .../maven/plugins/pmd/exec/ExecutorTest.java       |   2 +-
 34 files changed, 574 insertions(+), 143 deletions(-)
 copy src/it/{mpmd-168-empty-report => MPMD-283-aggregated-pmd}/invoker.properties (96%)
 copy src/it/{MPMD-266-typeresolution-aggregated => MPMD-283-aggregated-pmd}/module-a/pom.xml (90%)
 copy src/it/{MPMD-277-multi-module-check => MPMD-283-aggregated-pmd}/module-a/src/main/java/module/a/IModuleA.java (100%)
 copy src/it/{MPMD-277-multi-module-check => MPMD-283-aggregated-pmd}/module-a/src/main/java/module/a/ModuleA.java (100%)
 copy src/it/{MPMD-266-typeresolution-aggregated => MPMD-283-aggregated-pmd}/module-b/pom.xml (88%)
 copy src/it/{MPMD-277-multi-module-check => MPMD-283-aggregated-pmd}/module-b/src/main/java/module/b/ModuleB.java (100%)
 copy src/it/{MPMD-266-typeresolution-aggregated => MPMD-283-aggregated-pmd}/pom.xml (74%)
 copy src/it/{MPMD-266-typeresolution-aggregated => MPMD-283-aggregated-pmd}/ruleset.xml (94%)
 copy src/it/{MPMD-266-typeresolution-aggregated => MPMD-283-aggregated-pmd}/verify.groovy (59%)
 copy src/{it/MPMD-304-toolchain-support/src/main/java/sample/Name.java => main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java} (58%)
 copy src/{it/MPMD-304-toolchain-support/src/main/java/sample/Name.java => main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java} (57%)
 copy src/{it/MPMD-89-232-typeresolution/src/test/java/it/NoTestsHere.java => main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java} (56%)
 copy src/main/java/org/apache/maven/plugins/pmd/{PmdFileInfo.java => AggregatorPmdReport.java} (51%)
 copy src/{it/MPMD-304-toolchain-support/src/main/java/sample/Name.java => main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java} (57%)
 create mode 100644 src/site/apt/examples/aggregate.apt.vm

[maven-pmd-plugin] 01/02: [MPMD-283] Create a real aggregate goal

Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

adangel pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git

commit 5ae53f135b46102e7b749c834173cdc97678f834
Author: Andreas Dangel <ad...@apache.org>
AuthorDate: Sun Sep 5 20:02:32 2021 +0200

    [MPMD-283] Create a real aggregate goal
    
    Closes #45
---
 src/it/MPMD-283-aggregated-pmd/invoker.properties  |  19 ++
 src/it/MPMD-283-aggregated-pmd/module-a/pom.xml    |  46 +++++
 .../module-a/src/main/java/module/a/IModuleA.java  |  24 +++
 .../module-a/src/main/java/module/a/ModuleA.java   |  24 +++
 src/it/MPMD-283-aggregated-pmd/module-b/pom.xml    |  60 ++++++
 .../module-b/src/main/java/module/b/ModuleB.java   |  54 +++++
 src/it/MPMD-283-aggregated-pmd/pom.xml             | 107 ++++++++++
 src/it/MPMD-283-aggregated-pmd/ruleset.xml         |  32 +++
 src/it/MPMD-283-aggregated-pmd/verify.groovy       |  61 ++++++
 src/it/multi-module/pom.xml                        |   8 +
 .../maven/plugins/pmd/AbstractPmdReport.java       |  76 ++++++-
 .../plugins/pmd/AbstractPmdViolationCheckMojo.java |  11 +-
 .../maven/plugins/pmd/AggregatorCpdReport.java     |  41 ++++
 .../pmd/AggregatorCpdViolationCheckMojo.java       |  40 ++++
 .../plugins/pmd/AggregatorPmdNoForkReport.java     |  37 ++++
 .../maven/plugins/pmd/AggregatorPmdReport.java     |  43 ++++
 .../pmd/AggregatorPmdViolationCheckMojo.java       |  40 ++++
 .../org/apache/maven/plugins/pmd/CpdReport.java    |   9 +-
 .../maven/plugins/pmd/CpdViolationCheckMojo.java   |   2 +-
 .../org/apache/maven/plugins/pmd/PmdReport.java    |  12 +-
 .../maven/plugins/pmd/PmdViolationCheckMojo.java   |   2 +-
 src/site/apt/examples/aggregate.apt.vm             | 219 +++++++++++++++++++++
 src/site/apt/examples/javascriptReport.apt.vm      |   7 +
 src/site/apt/examples/jspReport.apt.vm             |   7 +
 src/site/apt/examples/multi-module-config.apt.vm   |   7 +
 src/site/apt/examples/removeReport.apt.vm          |  10 +-
 src/site/apt/index.apt.vm                          |  32 ++-
 src/site/apt/usage.apt.vm                          |  18 +-
 src/site/fml/faq.fml                               |   6 +
 src/site/site.xml                                  |   1 +
 30 files changed, 1029 insertions(+), 26 deletions(-)

diff --git a/src/it/MPMD-283-aggregated-pmd/invoker.properties b/src/it/MPMD-283-aggregated-pmd/invoker.properties
new file mode 100644
index 0000000..8faff53
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/invoker.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+invoker.goals = clean verify site
+invoker.maven.version = 3+
diff --git a/src/it/MPMD-283-aggregated-pmd/module-a/pom.xml b/src/it/MPMD-283-aggregated-pmd/module-a/pom.xml
new file mode 100644
index 0000000..0a62abe
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/module-a/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.plugins.pmd.it</groupId>
+    <artifactId>MPMD-283-aggregated-pmd</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>MPMD-283-aggregated-pmd-module-a</artifactId>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <configuration>
+          <rulesets>
+            <ruleset>../ruleset.xml</ruleset>
+          </rulesets>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/IModuleA.java b/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/IModuleA.java
new file mode 100644
index 0000000..83cfecf
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/IModuleA.java
@@ -0,0 +1,24 @@
+package module.a;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public interface IModuleA
+{
+}
\ No newline at end of file
diff --git a/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/ModuleA.java b/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/ModuleA.java
new file mode 100644
index 0000000..9d5d21d
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/module-a/src/main/java/module/a/ModuleA.java
@@ -0,0 +1,24 @@
+package module.a;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public class ModuleA implements IModuleA
+{
+}
\ No newline at end of file
diff --git a/src/it/MPMD-283-aggregated-pmd/module-b/pom.xml b/src/it/MPMD-283-aggregated-pmd/module-b/pom.xml
new file mode 100644
index 0000000..1833b2d
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/module-b/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.plugins.pmd.it</groupId>
+    <artifactId>MPMD-283-aggregated-pmd</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>MPMD-283-aggregated-pmd-module-b</artifactId>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <configuration>
+          <rulesets>
+            <ruleset>../ruleset.xml</ruleset>
+          </rulesets>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>MPMD-283-aggregated-pmd-module-a</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math</artifactId>
+      <version>2.2</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/src/it/MPMD-283-aggregated-pmd/module-b/src/main/java/module/b/ModuleB.java b/src/it/MPMD-283-aggregated-pmd/module-b/src/main/java/module/b/ModuleB.java
new file mode 100644
index 0000000..0689d93
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/module-b/src/main/java/module/b/ModuleB.java
@@ -0,0 +1,54 @@
+package module.b;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import module.a.IModuleA;
+import module.a.ModuleA;
+import org.apache.commons.math.complex.Complex;
+import org.apache.commons.math.FieldElement;
+
+public class ModuleB
+{
+    public static void main( String[] args )
+    {
+        ModuleA m = new ModuleA();
+        doSomething( m );
+    }
+
+    // this method will be detected as being unsued,
+    // if typeresolution is not setup correctly: module a needs
+    // to be on PMD's auxclasspath, so that PMD knows, that ModuleA
+    // implements IModuleA
+    private static void doSomething( IModuleA module )
+    {
+        System.out.println( module );
+    }
+
+    public static void aPublicMethod()
+    {
+        Complex u = new Complex(1, 1);
+        aPrivateMethod( u );
+    }
+
+    private static void aPrivateMethod( FieldElement<Complex> u )
+    {
+        System.out.println( "aPrivateMethod: " + u );
+    }
+}
\ No newline at end of file
diff --git a/src/it/MPMD-283-aggregated-pmd/pom.xml b/src/it/MPMD-283-aggregated-pmd/pom.xml
new file mode 100644
index 0000000..2d1e909
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.plugins.pmd.it</groupId>
+  <artifactId>MPMD-283-aggregated-pmd</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <modules>
+    <module>module-a</module>
+    <module>module-b</module>
+  </modules>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-site-plugin</artifactId>
+          <version>@sitePluginVersion@</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <configuration>
+          <typeResolution>true</typeResolution>
+          <failurePriority>1</failurePriority>
+          <linkXRef>false</linkXRef>
+          <rulesets>
+            <ruleset>ruleset.xml</ruleset>
+          </rulesets>
+        </configuration>
+        <executions>
+          <execution>
+            <inherited>false</inherited> <!-- don't run aggregate in child modules -->
+            <goals>
+              <goal>aggregate-pmd-check</goal>
+              <goal>aggregate-cpd-check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <configuration>
+          <typeResolution>true</typeResolution>
+          <rulesets>
+            <ruleset>ruleset.xml</ruleset>
+          </rulesets>
+          <skipEmptyReport>false</skipEmptyReport>
+          <linkXRef>false</linkXRef>
+        </configuration>
+        <reportSets>
+          <reportSet><!-- default reportSet - this is empty to prevent creating reports in child modules -->
+            <reports></reports>
+          </reportSet>
+          <reportSet><!-- aggregate reportSet, to define in poms having modules -->
+            <id>aggregate</id>
+            <inherited>false</inherited> <!-- don't run aggregate in child modules -->
+            <reports>
+              <report>aggregate-pmd</report>
+              <report>aggregate-cpd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
diff --git a/src/it/MPMD-283-aggregated-pmd/ruleset.xml b/src/it/MPMD-283-aggregated-pmd/ruleset.xml
new file mode 100644
index 0000000..71feeca
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/ruleset.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<ruleset name="Custom ruleset"
+    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
+    <description>Custom Ruleset for test case MPMD-283</description>
+
+    <rule ref="category/java/bestpractices.xml/UnusedPrivateMethod">
+        <priority>5</priority>
+    </rule>
+
+</ruleset>
diff --git a/src/it/MPMD-283-aggregated-pmd/verify.groovy b/src/it/MPMD-283-aggregated-pmd/verify.groovy
new file mode 100644
index 0000000..f6d1d28
--- /dev/null
+++ b/src/it/MPMD-283-aggregated-pmd/verify.groovy
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+def paths = [
+    "target/site/pmd.html",
+    "target/site/cpd.html",
+    "target/pmd.xml",
+    "target/cpd.xml",
+]
+
+// aggregated reports must exist
+for ( String path : paths )
+{
+    File file = new File( basedir, path )
+    System.out.println( "Checking for existence of " + file )
+    if ( !file.isFile() )
+    {
+        throw new RuntimeException( "Missing: " + file )
+    }
+}
+
+// double check violations: these violations only appear, if type resolution didn't work
+// in case the modules have not been compiled before
+File pmdXml = new File( basedir, "target/pmd.xml" )
+assert !pmdXml.text.contains( "Avoid unused private methods such as 'doSomething(IModuleA)'." )
+assert !pmdXml.text.contains( "Avoid unused private methods such as 'aPrivateMethod(FieldElement)'." )
+
+File pmdHtml = new File( basedir, "target/site/pmd.html" )
+assert !pmdHtml.text.contains( "Avoid unused private methods such as 'doSomething(IModuleA)'." )
+assert !pmdHtml.text.contains( "Avoid unused private methods such as 'aPrivateMethod(FieldElement)'." )
+
+// no individual module reports
+def modules = [ "module-a", "module-b" ]
+for ( String module : modules )
+{
+  for ( String path : paths )
+  {
+    File file = new File( basedir, "${module}/${path}" )
+    System.out.println( "Checking for absence of " + file )
+    if ( file.exists() )
+    {
+        throw new RuntimeException( "Banned: " + file )
+    }
+  }
+}
diff --git a/src/it/multi-module/pom.xml b/src/it/multi-module/pom.xml
index c7b6279..cde2108 100644
--- a/src/it/multi-module/pom.xml
+++ b/src/it/multi-module/pom.xml
@@ -71,6 +71,14 @@ under the License.
         <configuration>
           <skipPmdError>false</skipPmdError>
         </configuration>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>pmd</report>
+              <report>cpd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
       </plugin>
     </plugins>
   </reporting>
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
index ab8550d..7bdd483 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
@@ -23,13 +23,17 @@ import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
 
 import org.apache.maven.doxia.siterenderer.Renderer;
@@ -40,6 +44,7 @@ import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.AbstractMavenReport;
+import org.apache.maven.reporting.MavenReportException;
 import org.apache.maven.toolchain.Toolchain;
 import org.apache.maven.toolchain.ToolchainManager;
 import org.codehaus.plexus.util.FileUtils;
@@ -80,7 +85,7 @@ public abstract class AbstractPmdReport
      * Set the output format type, in addition to the HTML report. Must be one of: "none", "csv", "xml", "txt" or the
      * full class name of the PMD renderer to use. See the net.sourceforge.pmd.renderers package javadoc for available
      * renderers. XML is produced in any case, since this format is needed
-     * for the check goals (pmd:check, pmd:cpd-check).
+     * for the check goals (pmd:check, pmd:aggregator-check, pmd:cpd-check, pmd:aggregator-cpd-check).
      */
     @Parameter( property = "format", defaultValue = "xml" )
     protected String format = "xml";
@@ -160,8 +165,11 @@ public abstract class AbstractPmdReport
      * Whether to build an aggregated report at the root, or build individual reports.
      *
      * @since 2.2
+     * @deprecated since 3.15.0 Use the goals <code>pmd:aggregate-pmd</code> and <code>pmd:aggregate-cpd</code>
+     * instead.
      */
     @Parameter( property = "aggregate", defaultValue = "false" )
+    @Deprecated
     protected boolean aggregate;
 
     /**
@@ -421,9 +429,9 @@ public abstract class AbstractPmdReport
                 }
             }
         }
-        if ( aggregate )
+        if ( isAggregator() )
         {
-            for ( MavenProject localProject : reactorProjects )
+            for ( MavenProject localProject : getAggregatedProjects() )
             {
                 List<String> localCompileSourceRoots = localProject.getCompileSourceRoots();
                 for ( String root : localCompileSourceRoots )
@@ -551,7 +559,7 @@ public abstract class AbstractPmdReport
             return false;
         }
 
-        if ( "pom".equals( project.getPackaging() ) && !aggregate )
+        if ( !isAggregator() && "pom".equalsIgnoreCase( project.getPackaging() ) )
         {
             return false;
         }
@@ -662,4 +670,62 @@ public abstract class AbstractPmdReport
 
         return tc;
     }
-}
\ No newline at end of file
+
+    protected boolean isAggregator()
+    {
+        // returning here aggregate for backwards compatibility
+        return aggregate;
+    }
+
+    // Note: same logic as in m-javadoc-p (MJAVADOC-134)
+    protected Collection<MavenProject> getAggregatedProjects()
+    {
+        Map<Path, MavenProject> reactorProjectsMap = new HashMap<>();
+        for ( MavenProject reactorProject : this.reactorProjects )
+        {
+            reactorProjectsMap.put( reactorProject.getBasedir().toPath(), reactorProject );
+        }
+
+        return modulesForAggregatedProject( project, reactorProjectsMap );
+    }
+
+    /**
+     * Recursively add the modules of the aggregatedProject to the set of aggregatedModules.
+     * 
+     * @param aggregatedProject the project being aggregated
+     * @param reactorProjectsMap map of (still) available reactor projects 
+     * @throws MavenReportException if any
+     */
+    private Set<MavenProject> modulesForAggregatedProject( MavenProject aggregatedProject,
+                                                           Map<Path, MavenProject> reactorProjectsMap )
+    {
+        // Maven does not supply an easy way to get the projects representing
+        // the modules of a project. So we will get the paths to the base
+        // directories of the modules from the project and compare with the
+        // base directories of the projects in the reactor.
+
+        if ( aggregatedProject.getModules().isEmpty() )
+        {
+            return Collections.singleton( aggregatedProject );
+        }
+
+        List<Path> modulePaths = new LinkedList<Path>();
+        for ( String module :  aggregatedProject.getModules() )
+        {
+            modulePaths.add( new File( aggregatedProject.getBasedir(), module ).toPath() );
+        }
+
+        Set<MavenProject> aggregatedModules = new LinkedHashSet<>();
+
+        for ( Path modulePath : modulePaths )
+        {
+            MavenProject module = reactorProjectsMap.remove( modulePath );
+            if ( module != null )
+            {
+                aggregatedModules.addAll( modulesForAggregatedProject( module, reactorProjectsMap ) );
+            }
+        }
+
+        return aggregatedModules;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
index 6f0b3ea..88bdaba 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
@@ -60,8 +60,11 @@ public abstract class AbstractPmdViolationCheckMojo<D>
      * Whether to build an aggregated report at the root, or build individual reports.
      *
      * @since 2.2
+     * @deprecated since 3.15.0 Use the goal <code>pmd:aggregate-check</code> or
+     * <code>pmd:aggregate-cpd-check</code> instead.
      */
     @Parameter( property = "aggregate", defaultValue = "false" )
+    @Deprecated
     protected boolean aggregate;
 
     /**
@@ -129,7 +132,7 @@ public abstract class AbstractPmdViolationCheckMojo<D>
             return;
         }
 
-        if ( "pom".equals( project.getPackaging() ) && !aggregate )
+        if ( !isAggregator() && "pom".equalsIgnoreCase( project.getPackaging() ) )
         {
             return;
         }
@@ -317,4 +320,10 @@ public abstract class AbstractPmdViolationCheckMojo<D>
     {
         return maxAllowedViolations;
     }
+
+    protected boolean isAggregator()
+    {
+        // returning here aggregate for backwards compatibility
+        return aggregate;
+    }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java
new file mode 100644
index 0000000..e3aa906
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java
@@ -0,0 +1,41 @@
+package org.apache.maven.plugins.pmd;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Creates a report for PMD's Copy/Paste Detector (CPD) tool in an <b>aggregator</b> project.
+ * It can also generate a cpd results file in any of these formats: xml, csv or txt.
+ *
+ * <p>See <a href="https://pmd.github.io/latest/pmd_userdocs_cpd.html">Finding duplicated code</a>
+ * for more details.
+ *
+ * @since 3.15.0
+ */
+@Mojo( name = "aggregate-cpd", aggregator = true, threadSafe = true )
+public class AggregatorCpdReport extends CpdReport
+{
+    @Override
+    protected boolean isAggregator()
+    {
+        return true;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java
new file mode 100644
index 0000000..25bbb78
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java
@@ -0,0 +1,40 @@
+package org.apache.maven.plugins.pmd;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Fail the build in an <b>aggregator</b> project if there were any CPD violations in the source code.
+ *
+ * @since 3.15.0
+ */
+@Mojo( name = "aggregate-cpd-check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true, aggregator = true )
+@Execute( goal = "aggregate-cpd" )
+public class AggregatorCpdViolationCheckMojo extends CpdViolationCheckMojo
+{
+    @Override
+    protected boolean isAggregator()
+    {
+        return true;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java
new file mode 100644
index 0000000..216ebae
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java
@@ -0,0 +1,37 @@
+package org.apache.maven.plugins.pmd;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
+/**
+ * Creates a PMD site report in an <b>aggregator</b> project without forking the <code>test-compile</code> phase again.
+ * 
+ * @since 3.15.0
+ */
+@Mojo( name = "aggregate-pmd-no-fork", aggregator = true, threadSafe = true,
+    requiresDependencyResolution = ResolutionScope.TEST )
+@Execute( phase = LifecyclePhase.NONE )
+public class AggregatorPmdNoForkReport extends AggregatorPmdReport
+{
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java
new file mode 100644
index 0000000..3495241
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java
@@ -0,0 +1,43 @@
+package org.apache.maven.plugins.pmd;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
+/**
+ * Creates a PMD site report in an <b>aggregator</b> project based on the rulesets and configuration set in the plugin.
+ * It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.
+ * 
+ * @since 3.15.0
+ */
+@Mojo( name = "aggregate-pmd", aggregator = true, threadSafe = true,
+    requiresDependencyResolution = ResolutionScope.TEST )
+@Execute( phase = LifecyclePhase.TEST_COMPILE )
+public class AggregatorPmdReport extends PmdReport
+{
+    @Override
+    protected boolean isAggregator()
+    {
+        return true;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java
new file mode 100644
index 0000000..6fdcab3
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java
@@ -0,0 +1,40 @@
+package org.apache.maven.plugins.pmd;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Fails the build in an <b>aggregator</b> project if there were any PMD violations in the source code.
+ *
+ * @since 3.15.0
+ */
+@Mojo( name = "aggregate-pmd-check", defaultPhase = LifecyclePhase.VERIFY, aggregator = true, threadSafe = true )
+@Execute( goal = "aggregate-pmd" )
+public class AggregatorPmdViolationCheckMojo extends PmdViolationCheckMojo
+{
+    @Override
+    protected boolean isAggregator()
+    {
+        return true;
+    }
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
index 1af30da..8964e60 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
@@ -41,8 +41,10 @@ import net.sourceforge.pmd.cpd.JavaTokenizer;
 import net.sourceforge.pmd.cpd.renderer.CPDRenderer;
 
 /**
- * Creates a report for PMD's CPD tool. See
- * <a href="https://pmd.github.io/latest/pmd_userdocs_cpd.html">Finding duplicated code</a>
+ * Creates a report for PMD's Copy/Paste Detector (CPD) tool.
+ * It can also generate a cpd results file in any of these formats: xml, csv or txt.
+ *
+ * <p>See <a href="https://pmd.github.io/latest/pmd_userdocs_cpd.html">Finding duplicated code</a>
  * for more details.
  *
  * @author Mike Perham
@@ -265,7 +267,8 @@ public class CpdReport
 
     private void generateMavenSiteReport( Locale locale )
     {
-        CpdReportGenerator gen = new CpdReportGenerator( getSink(), filesToProcess, getBundle( locale ), aggregate );
+        CpdReportGenerator gen = new CpdReportGenerator( getSink(), filesToProcess, getBundle( locale ),
+                isAggregator() );
         gen.generate( cpdResult.getDuplications() );
     }
 
diff --git a/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
index 56bd004..9fab222 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
@@ -37,7 +37,7 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
- * Fail the build if there were any CPD violations in the source code.
+ * Fails the build if there were any CPD violations in the source code.
  *
  * @version $Id$
  * @since 2.0
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
index 6becd50..04483da 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
@@ -57,7 +57,8 @@ import org.codehaus.plexus.util.StringUtils;
 import net.sourceforge.pmd.renderers.Renderer;
 
 /**
- * Creates a PMD report.
+ * Creates a PMD site report based on the rulesets and configuration set in the plugin.
+ * It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.
  *
  * @author Brett Porter
  * @version $Id$
@@ -489,7 +490,8 @@ public class PmdReport
         throws MavenReportException
     {
         Sink sink = getSink();
-        PmdReportGenerator doxiaRenderer = new PmdReportGenerator( getLog(), sink, getBundle( locale ), aggregate );
+        PmdReportGenerator doxiaRenderer = new PmdReportGenerator( getLog(), sink, getBundle( locale ),
+                isAggregator() );
         doxiaRenderer.setRenderRuleViolationPriority( renderRuleViolationPriority );
         doxiaRenderer.setRenderViolationsByPriority( renderViolationsByPriority );
         doxiaRenderer.setFiles( filesToProcess );
@@ -549,7 +551,7 @@ public class PmdReport
         try
         {
             List<String> classpath = new ArrayList<>();
-            if ( aggregate )
+            if ( isAggregator() )
             {
                 List<String> dependencies = new ArrayList<>();
 
@@ -557,7 +559,7 @@ public class PmdReport
                 // if module a depends on module b and both are in the reactor
                 // then we don't want to resolve the dependency as an artifact.
                 List<String> exclusionPatterns = new ArrayList<>();
-                for ( MavenProject localProject : reactorProjects )
+                for ( MavenProject localProject : getAggregatedProjects() )
                 {
                     exclusionPatterns.add( localProject.getGroupId() + ":" + localProject.getArtifactId() );
                 }
@@ -567,7 +569,7 @@ public class PmdReport
                                      : ScopeFilter.including( "compile", "provided" )
                 ) );
 
-                for ( MavenProject localProject : reactorProjects )
+                for ( MavenProject localProject : getAggregatedProjects() )
                 {
                     ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(
                             session.getProjectBuildingRequest() );
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
index 3f6200e..8ff7e62 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
@@ -39,7 +39,7 @@ import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
- * Fail the build if there were any PMD violations in the source code.
+ * Fails the build if there were any PMD violations in the source code.
  *
  * @version $Id$
  * @since 2.0
diff --git a/src/site/apt/examples/aggregate.apt.vm b/src/site/apt/examples/aggregate.apt.vm
new file mode 100644
index 0000000..7b1bcd2
--- /dev/null
+++ b/src/site/apt/examples/aggregate.apt.vm
@@ -0,0 +1,219 @@
+ ------
+ Aggregating PMD reports for Multi-Module-Projects
+ ------
+ Andreas Dangel
+ ------
+ 2021-09-03
+ ------
+
+~~ Licensed to the Apache Software Foundation (ASF) under one
+~~ or more contributor license agreements.  See the NOTICE file
+~~ distributed with this work for additional information
+~~ regarding copyright ownership.  The ASF licenses this file
+~~ to you under the Apache License, Version 2.0 (the
+~~ "License"); you may not use this file except in compliance
+~~ with the License.  You may obtain a copy of the License at
+~~
+~~   http://www.apache.org/licenses/LICENSE-2.0
+~~
+~~ Unless required by applicable law or agreed to in writing,
+~~ software distributed under the License is distributed on an
+~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+~~ KIND, either express or implied.  See the License for the
+~~ specific language governing permissions and limitations
+~~ under the License.
+
+~~ NOTE: For help with the syntax of this file, see:
+~~ http://maven.apache.org/doxia/references/apt-format.html
+
+Aggregating PMD reports for Multi-Module-Projects
+
+ For example, consider the following directory structure:
+
++-----+
+
+Project
+  |-- pom.xml
+  |-- Module1
+  |   `-- pom.xml
+  |   `-- Module 2
+  |       `-- pom.xml
+  |   `-- Module 3
+  |       `-- pom.xml
+  |-- Module4
+  |   `-- pom.xml
+  `-- Module5
+    `-- pom.xml
+
++-----+
+
+ Since 3.15.0 the <<<aggregate>>> has changed a little bit. It'll generate aggregated 
+ reports at every level.
+ To get only an aggregated project at root level, you need to configure the pom like:
+ 
++-----+
+<project>
+  ...
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>${project.version}</version>
+        <reportSets>
+          <reportSet>
+            <id>aggregate</id>
+            <inherited>false</inherited> <!-- don't run aggregate in child modules -->
+            <reports>
+              <report>aggregate-pmd</report>
+              <report>aggregate-cpd</report>
+            </reports>
+          </reportSet>
+          <reportSet>
+            <id>default</id>
+            <reports>
+              <report>pmd</report>
+              <report>cpd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+    </plugins>
+    ...
+  </reporting>
+  ...
+</project>
++-----+
+
+* Using The <<<aggregate>>> Goals
+
+ The {{{../pmd-mojo.html#aggregate}\<aggregate/\>}} parameter doesn't make sure, that the project is
+ compiled before executing PMD which might lead to wrong results. Therefore the report goals
+ <<<aggregate-pmd>>> and <<<aggregate-cpd>>> have been introduced. You could define these goals in the
+ \<build/\> element (using the \<execution/\> tag) or \<reporting/\> element (using the \<reportSet/\> tag) as shown
+ below.
+
++-----+
+<project>
+  ...
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>${project.version}</version>
+        <configuration>
+          <!-- Default configuration for all reports -->
+          ...
+        </configuration>
+        <executions>
+          <execution>
+            <id>aggregate</id>
+            <goals>
+              <goal>aggregate-pmd</goal>
+              <goal>aggregate-cpd</goal>
+            </goals>
+            <phase>site</phase>
+            <configuration>
+              <!-- Specific configuration for the aggregate report -->
+              ...
+            </configuration>
+          </execution>
+          ...
+        </executions>
+      </plugin>
+      ...
+    </plugins>
+  </build>
+  ...
+</project>
++-----+
+
++-----+
+<project>
+  ...
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>${project.version}</version>
+        <configuration>
+          <!-- Default configuration for all reports -->
+          ...
+        </configuration>
+        <reportSets>
+          <reportSet>
+            <id>non-aggregate</id>
+            <configuration>
+              <!-- Specific configuration for the non aggregate report -->
+              ...
+            </configuration>
+            <reports>
+              <report>pmd</report>
+              <report>cpd</report>
+            </reports>
+          </reportSet>
+          <reportSet>
+            <id>aggregate</id>
+            <configuration>
+              <!-- Specific configuration for the aggregate report -->
+              ...
+            </configuration>
+            <reports>
+              <report>aggregate-pmd</report>
+              <report>aggregate-cpd</report>
+            </reports>
+          </reportSet>
+          ...
+        </reportSets>
+      </plugin>
+      ...
+    </plugins>
+  </reporting>
+  ...
+</project>
++-----+
+
+* Generate aggregate PMD without duplicate execution of phase test-compile
+
+ * The standard goal <<<aggregate-pmd>>> invokes separate lifecyle <<<test-compile>>>.
+
+ * In a CI environment you now might execute something like <<<mvn clean deploy site site-deploy>>>.
+
+ * During <<<site>>> build the standard reports will trigger <<<test-compile>>> again,
+ depending on your build this may take some time, because
+ stuff like <<<enforcer>>> or generating stubs from a WDSL will be invoked again, which may lead
+ to longer build times.
+
+ * As of version 3.15.0 a new report is defined, <<<aggregate-pmd-no-fork>>>
+ which will not trigger above phases a second time.
+
+ * Note: This is only a problem for PMD report. CPD does not invoke a separate lifecycle.
+
+ * Configure this in your <<<reporting>>> section as follows:
+
++-----+
+<project>
+  ...
+  <reporting>
+    <excludeDefaults>true</excludeDefaults>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>${project.version}</version>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>aggregate-pmd-no-fork</report>
+              <report>aggregate-cpd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+    </plugins>
+  </reporting>
+  ...
+</project>
++-----+
diff --git a/src/site/apt/examples/javascriptReport.apt.vm b/src/site/apt/examples/javascriptReport.apt.vm
index 5159d64..3883059 100644
--- a/src/site/apt/examples/javascriptReport.apt.vm
+++ b/src/site/apt/examples/javascriptReport.apt.vm
@@ -62,6 +62,13 @@ Analyzing JavaScript Code
             <compileSourceRoot>${basedir}/src/main/javascript</compileSourceRoot>
           </compileSourceRoots>
         </configuration>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>pmd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
       </plugin>
     </plugins>
   </reporting>
diff --git a/src/site/apt/examples/jspReport.apt.vm b/src/site/apt/examples/jspReport.apt.vm
index c1802c8..a75a44d 100644
--- a/src/site/apt/examples/jspReport.apt.vm
+++ b/src/site/apt/examples/jspReport.apt.vm
@@ -65,6 +65,13 @@ Analyzing JSP Code
             <compileSourceRoot>${basedir}/src/main/webapp</compileSourceRoot>
           </compileSourceRoots>
         </configuration>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>pmd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
       </plugin>
     </plugins>
   </reporting>
diff --git a/src/site/apt/examples/multi-module-config.apt.vm b/src/site/apt/examples/multi-module-config.apt.vm
index 1af734a..19e933c 100644
--- a/src/site/apt/examples/multi-module-config.apt.vm
+++ b/src/site/apt/examples/multi-module-config.apt.vm
@@ -182,6 +182,13 @@ whizbang
             <ruleset>whizbang/pmd-ruleset.xml</ruleset>
           </rulesets>
         </configuration>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>pmd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
       </plugin>
     </plugins>
   </reporting>
diff --git a/src/site/apt/examples/removeReport.apt.vm b/src/site/apt/examples/removeReport.apt.vm
index a1570fe..ff1afa7 100644
--- a/src/site/apt/examples/removeReport.apt.vm
+++ b/src/site/apt/examples/removeReport.apt.vm
@@ -3,7 +3,7 @@
  ------
  Dennis Lundberg
  ------
- 2007-12-28
+ 2021-09-03
  ------
 
  ~~ Licensed to the Apache Software Foundation (ASF) under one
@@ -28,8 +28,9 @@
 
 Remove Report
 
- You may want to generate only one of the reports, but not the other.  To do
- this you can use the <<<\<reportSets\>>>> feature within your POM.  Below is
+ You may want to generate only one of the reports, but not the other. Since version 3.15.0 separate
+ aggregate reports have been added, which would duplicate the reports. To select only the reports you want
+ you can use the <<<\<reportSets\>>>> feature within your POM.  Below is
  the default configuration for the plugin.  To disable one of the reports,
  just copy the <<<\<reportSets\>>>> element below to your POM and remove the
  <<<\<report\>>>> you don't want to generate.
@@ -47,6 +48,9 @@ Remove Report
             <reports>
               <report>pmd</report>
               <report>cpd</report>
+              <report>aggregate-pmd</report>
+              <report>aggregate-pmd-no-fork</report>
+              <report>aggregate-cpd</report>
             </reports>
           </reportSet>
         </reportSets>
diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm
index 613bd3d..a6dea66 100644
--- a/src/site/apt/index.apt.vm
+++ b/src/site/apt/index.apt.vm
@@ -37,19 +37,37 @@ ${project.name}
 
 * Goals Overview
 
-  This plugin has 4 goals:
+  This plugin has the following goals:
 
   * {{{./pmd-mojo.html}pmd:pmd}} creates a PMD site report based on the rulesets and configuration set in the plugin.
     It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.
 
-  * {{{./cpd-mojo.html}pmd:cpd}} generates a report for PMD's Copy/Paste Detector (CPD) tool.  It can also
+  * {{{./aggregate-pmd-mojo.html}pmd:aggregate-pmd}} creates a PMD site report in an <<aggregator>> project
+    based on the rulesets and configuration set in the plugin. It can also generate a pmd output file aside from
+    the site report in any of the following formats: xml, csv or txt.
+
+  * {{{./aggregate-pmd-no-fork-mojo.html}pmd:aggregate-pmd-no-fork}} creates a PMD site report in an <<aggregator>>
+    project without forking the <<<test-compile>>> phase again.
+
+  * {{{./cpd-mojo.html}pmd:cpd}} creates a report for PMD's Copy/Paste Detector (CPD) tool. It can also
     generate a cpd results file in any of these formats: xml, csv or txt.
 
-  * {{{./check-mojo.html}pmd:check}} verifies that the PMD report is empty and fails the build if it is not.
-    This goal is executed by default when <<<pmd:pmd>>> is executed.
+  * {{{./aggregate-cpd-mojo}pmd:aggregate-cpd}} creates a report for PMD's Copy/Paste Detector (CPD) tool
+    in an <<aggregator>> project. It can also generate a cpd results file in any of these formats: xml, csv or txt.
+
+  * {{{./check-mojo.html}pmd:check}} fails the build if there were any PMD violations in the source code.
+    This goal invokes automatically <<<pmd:pmd>>> prior to executing itself.
 
-  * {{{./cpd-check-mojo.html}pmd:cpd-check}} verifies that the CPD report is empty and fails the build if it is not.
-    This goal is executed by default when <<<pmd:cpd>>> is executed.
+  * {{{./aggregate-pmd-check-mojo.html}pmd:aggregate-pmd-check}} fails the build in an <<aggregator>> project if there
+    were any PMD violations in the source code.
+    This goal invokes automatically <<<pmd:aggregate-pmd>>> prior to executing itself.
+
+  * {{{./cpd-check-mojo.html}pmd:cpd-check}} fails the build if there were any CPD violations in the source code.
+    This goal invokes automatically <<<pmd:cpd>>> prior to executing itself.
+
+  * {{{./aggregate-cpd-check-mojo.html}pmd:aggregate-cpd-check}} fails the build in an <<aggregator>> project
+    if there were any CPD violations in the source code.
+    This goal invokes automatically <<<pmd:aggregate-cpd>>> prior to executing itself.
 
 * Usage
 
@@ -86,6 +104,8 @@ ${project.name}
 
   * {{{./examples/multi-module-config.html}Multimodule Configuration}}
 
+  * {{{./examples/aggregate.html}Aggregating PMD reports for Multi-Module-Projects}}
+
   * {{{./examples/removeReport.html}Remove Report}}
 
   * {{{./examples/targetJdk.html}Target JDK and Toolchains}}
diff --git a/src/site/apt/usage.apt.vm b/src/site/apt/usage.apt.vm
index 6bcfe52..6b91235 100644
--- a/src/site/apt/usage.apt.vm
+++ b/src/site/apt/usage.apt.vm
@@ -81,7 +81,7 @@ Configuration
   You can configure the minimum code size which trips the CPD.  The default of <<<100>>> tokens corresponds
   to approximately 5-10 lines of code.
 
-  Since PMD parses the Java source, it needs to know which Java version to use. CPD's default is <<<1.9>>>.
+  Since PMD parses the Java source, it needs to know which Java version to use.
   The following is a possible configuration:
 
 +-----+
@@ -106,6 +106,22 @@ Configuration
             <excludeRoot>target/generated-sources/stubs</excludeRoot>
           </excludeRoots>
         </configuration>
+        <reportSets>
+          <reportSet><!-- by default, id = "default" -->
+            <reports><!-- select non-aggregate reports -->
+              <report>pmd</report>
+              <report>cpd</report>
+            </reports>
+          </reportSet>
+          <reportSet><!-- aggregate reportSet, to define in poms having modules -->
+            <id>aggregate</id>
+            <inherited>false</inherited> <!-- don't run aggregate in child modules -->
+            <reports>
+              <report>aggregate-pmd</report>
+              <report>aggregate-cpd</report>
+            </reports>
+          </reportSet>
+        </reportSets>
       </plugin>
     </plugins>
   </reporting>
diff --git a/src/site/fml/faq.fml b/src/site/fml/faq.fml
index 658a154..bcef70a 100644
--- a/src/site/fml/faq.fml
+++ b/src/site/fml/faq.fml
@@ -126,6 +126,12 @@ under the License.
           First pass will compile the projects (e.g. <code>mvn clean package</code>) and the second pass
           will execute PMD without clean via the verify phase (e.g. <code>mvn verify</code>).
         </p>
+        <p>
+          Since version 3.15.0 the new goal <a href="aggregate-pmd-mojo.html">aggregate-pmd</a> can be used
+          which allows to run everything with only one maven call. However, this goal invokes the lifecycle
+          <em>test-compile</em> before executing itself, which might lead to duplicated execution of some
+          plugins.
+        </p>
       </answer>
     </faq>
   </part>
diff --git a/src/site/site.xml b/src/site/site.xml
index d3d61c3..7df2790 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -35,6 +35,7 @@ under the License.
     <menu name="Examples">
       <item name="Upgrading PMD at Runtime" href="examples/upgrading-PMD-at-runtime.html"/>
       <item name="Multimodule Configuration" href="examples/multi-module-config.html"/>
+      <item name="Aggregating PMD reports" href="examples/aggregate.html"/>
       <item name="Remove Report" href="examples/removeReport.html"/>
       <item name="Target JDK and Toolchains" href="examples/targetJdk.html"/>
       <item name="Using Rule Sets" href="examples/usingRuleSets.html"/>

[maven-pmd-plugin] 02/02: [MPMD-308] Set Maven 3.1.0 as minimum version

Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

adangel pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git

commit 3ffd4d3762028b1b0a8f714297a21de37d0c5649
Author: Andreas Dangel <ad...@apache.org>
AuthorDate: Sun Sep 5 20:04:16 2021 +0200

    [MPMD-308] Set Maven 3.1.0 as minimum version
    
    Remove now unnecessary maven-compat, fix test
    Downgrade wiremock, to use a with maven compatible
    guava version.
    
    Closes #46
---
 pom.xml                                            | 26 +++++++++++++---------
 .../plugins/pmd/CpdViolationCheckMojoTest.java     | 15 ++++++++++---
 .../apache/maven/plugins/pmd/PmdReportTest.java    | 10 +++++----
 .../maven/plugins/pmd/exec/ExecutorTest.java       |  2 +-
 4 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/pom.xml b/pom.xml
index c5ccdee..657f4ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,7 +85,7 @@ under the License.
   </distributionManagement>
 
   <properties>
-    <mavenVersion>3.0</mavenVersion>
+    <mavenVersion>3.1.0</mavenVersion>
     <doxiaVersion>1.9.1</doxiaVersion>
     <doxiaSitetoolsVersion>1.9.2</doxiaSitetoolsVersion>
     <javaVersion>8</javaVersion><!-- Because PMD 6.35.0+ requires Java 8 -->
@@ -131,12 +131,18 @@ under the License.
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-common-artifact-filters</artifactId>
-      <version>3.1.0</version>
+      <version>${mavenVersion}</version>
+      <exclusions>
+          <exclusion>
+              <groupId>org.sonatype.sisu</groupId>
+              <artifactId>sisu-guice</artifactId>
+          </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-embedder</artifactId>
-      <version>3.1.0</version>
+      <version>${mavenVersion}</version>
       <scope>provided</scope>
       <exclusions>
         <!-- exclude old asm:asm, as pmd brings in a newer version (org.ow2.asm:asm) -->
@@ -239,21 +245,19 @@ under the License.
 
     <!-- test -->
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-compat</artifactId>
-      <version>${mavenVersion}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.apache.maven.plugin-testing</groupId>
       <artifactId>maven-plugin-testing-harness</artifactId>
-      <version>2.1</version>
+      <version>${mavenVersion}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.github.tomakehurst</groupId>
       <artifactId>wiremock</artifactId>
-      <version>2.9.0</version>
+      <!-- that's a very old version, but it's the newest one that brings in
+           a old guava version, that is compatible with maven 3.1.0.
+           maven 3.1.0 uses guava 10, wiremock 1.49 uses guava 13.0.1
+      -->
+      <version>1.49</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java b/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
index 081da74..730a30a 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
@@ -42,13 +42,22 @@ public class CpdViolationCheckMojoTest
     public void testDefaultConfiguration()
         throws Exception
     {
+        File testPom =
+            new File( getBasedir(),
+                      "src/test/resources/unit/default-configuration/cpd-default-configuration-plugin-config.xml" );
+        final CpdReport mojo = (CpdReport) lookupMojo( "cpd", testPom );
+        mojo.execute();
+
+        // clear the output from previous pmd:cpd execution
+        CapturingPrintStream.init( true );
+
         try
         {
-            final File testPom =
+            testPom =
                 new File( getBasedir(),
                           "src/test/resources/unit/default-configuration/pmd-check-default-configuration-plugin-config.xml" );
-            final CpdViolationCheckMojo mojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
-            mojo.execute();
+            final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
+            cpdViolationMojo.execute();
 
             fail( "MojoFailureException should be thrown." );
         }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
index f8e4683..93f9f88 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
@@ -245,10 +245,11 @@ public class PmdReportTest
         final String sonarProfileUrl = sonarBaseUrl + "/export?format=pmd&language=java&name=Sonar%2520way";
         final String sonarExportRulesetUrl = "http://localhost:" + mockServer.port() + sonarProfileUrl;
 
-        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( sonarBaseUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
+        WireMock.configureFor( "localhost", port );
+        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarBaseUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
                                                                                                                                                "text/html" ).withBody( sonarMainPageHtml ) ) );
 
-        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
+        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
                                                                                                                                                   "text/xml" ).withBody( sonarRuleset ) ) );
 
         URL url = getClass().getClassLoader().getResource( "rulesets/java/basic.xml" );
@@ -719,10 +720,11 @@ public class PmdReportTest
         final String myRulesetBaseUrl = "/config/my-ruleset.xml";
         final String myRulesetUrl = "http://localhost:" + mockServer.port() + myRulesetBaseUrl;
 
-        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) )
+        WireMock.configureFor( "localhost", port );
+        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) )
                 .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
                                                                                 "text/xml" ).withBody( sonarRuleset ) ) );
-        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( myRulesetBaseUrl ) )
+        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( myRulesetBaseUrl ) )
                 .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
                                                                                 "text/xml" ).withBody( sonarRuleset ) ) );
 
diff --git a/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java b/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
index 67dad92..d63eecb 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
@@ -25,8 +25,8 @@ import java.net.URL;
 import java.net.URLClassLoader;
 
 import org.apache.commons.lang3.SystemUtils;
-import org.junit.Assert;
 
+import junit.framework.Assert;
 import junit.framework.TestCase;
 
 public class ExecutorTest extends TestCase