Сбой PMD с пользовательскими наборами правил для проекта с несколькими модулями - PullRequest
0 голосов
/ 03 мая 2020

Как определить custom-rulesets.xml в родительском проекте, чтобы он снова использовался в дочерних модулях ?

У меня есть пример проекта PMD, который работает хорошо ( вы можете проверьте позже ).

Однако у этого проекта maven нет дочерних элементов.

Структура проекта

pmd-java-14-example _.
                     |_ core
                     |_ tasks

пользовательских правил. xml

<?xml version="1.0"?>

<!-- https://github.com/pmd/pmd/blob/master/pmd-java/src/main/resources/rulesets/java/basic.xml -->
<!-- https://pmd.github.io/pmd/pmd_rules_java_codestyle.html#shortvariable -->
<ruleset
        name="custom-ruleset"
        xmlns="http://pmd.sourceforge.net/ruleset/2.0.0">
    <description>
        The Basic ruleset contains a collection of good practices which should be followed.
    </description>

    <rule ref="category/java/design.xml/SimplifiedTernary"/>
    <rule ref="category/java/codestyle.xml/MethodArgumentCouldBeFinal"/>
    <rule ref="category/java/codestyle.xml/LocalVariableCouldBeFinal"/>
    <rule ref="category/java/errorprone.xml/AvoidDecimalLiteralsInBigDecimalConstructor"/>
    <rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
    <rule ref="category/java/bestpractices.xml/UnusedPrivateField"/>
    <rule ref="category/java/codestyle.xml/DuplicateImports"/>
    <rule ref="category/java/codestyle.xml/ShortMethodName"/>
    <rule ref="category/java/codestyle.xml/ShortVariable"/>
</ruleset>

Когда у меня есть родительский pom и дочерний модуль, pmd завершается сбоем для дочернего модуля, поскольку он не может найти пользовательских наборов правил. xml .

pom. xml (родительский pom с дочерним модулем).

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yk.utils</groupId>
    <artifactId>pmd-java-14-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>


    <properties>
        <java.version>14</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <pmd.plugin.version>3.13.0</pmd.plugin.version>
        <pmd.core.version>6.23.0</pmd.core.version>
    </properties>


    <modules>
        <module>core</module>
        <module>tasks</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>
    </dependencies>


    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jxr-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </reporting>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-pmd-plugin</artifactId>
                    <version>${pmd.plugin.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <configuration>
                    <failOnViolation>true</failOnViolation>
                    <printFailingErrors>true</printFailingErrors>
                    <targetJdk>${java.version}</targetJdk>


                    <rulesets>
                        <!-- https://maven.apache.org/plugins/maven-pmd-plugin/examples/usingRuleSets.html -->
                        <ruleset>/rulesets/java/maven-pmd-plugin-default.xml</ruleset>

                        <!-- https://github.com/pmd/pmd/blob/master/pmd-java/src/main/resources/rulesets/java/basic.xml -->
                        <!-- https://github.com/pmd/pmd/blob/master/pmd-core/src/main/resources/rulesets/internal/all-java.xml -->
                        <ruleset>/category/java/bestpractices.xml</ruleset>
                        <ruleset>
                            custom-ruleset.xml
                        </ruleset>
                    </rulesets>
                </configuration>
                <executions>
                    <execution>
                        <id>check pmd and fail</id>
                        <phase>package</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>

                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-java</artifactId>
                        <version>${pmd.core.version}</version>
                    </dependency>

                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-core</artifactId>
                        <version>${pmd.core.version}</version>
                    </dependency>
                </dependencies>
            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.9.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </build>
</project>

Разница в том, что теперь pom имеет дочерние модули и <packaging>pom</packaging>.

Эта часть не проходит mvn clean install

<ruleset>custom-ruleset.xml</ruleset>

Сообщения об ошибках

[INFO]
[INFO] pmd-java-14-example ................................ SUCCESS [  0.922 s]
[INFO] core ............................................... FAILURE [  1.929 s]
[INFO] tasks .............................................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.980 s
[INFO] Finished at: 2020-05-03T13:15:45+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-pmd-plugin:3.13.0:pmd (pmd) on project bst-core: Execution pmd of goal org.apache.maven.plugins:maven-pmd-plugin:3.13.0:pmd failed: org.apache.maven.reporting.MavenReport
Exception: Could not find resource 'pmd-java-14-example\core\custom-ruleset.xml'. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.

Что я пробовал

Как я понимаю, maven использует custom-rulesets.xml файл для родительских модулей - это успешно, затем он пытается использовать этот файл для дочернего модуля, и, конечно, этот файл отсутствует в дочернем модуле.

Я попытался установить свойство - absolute p до места нахождения custom-rulesets.xml. Это работает, однако, я не могу положить sh его в github.

Я также могу сделать pu sh это пользовательское правило, установленное на git hub, добавить ссылку на репозиторий и файл github и использовать его. Это лучшая альтернатива.

И, конечно, я не хочу копировать и вставлять этот файл в разные дочерние модули.

1 Ответ

0 голосов
/ 03 мая 2020

Пожалуйста, опубликуйте свои ответы, потому что это быстрый обходной путь, который мне нужен сейчас!

<ruleset>../custom-ruleset.xml</ruleset>.

Пояснение, моя структура проекта - это один родитель, у которого есть два дочерних модуля , Так как дочерние элементы находятся на одном уровне в дереве каталогов, ../, таким образом, работает.

Однако это не будет работать, если в родительской папке есть папка src или если дочерний модуль имеет дочерние элементы. а также.

...