Сценарий Ant с проверкой PMD не распознает JDK 1.8

Всем привет,

В настоящее время я работаю над устаревшей системой и перемещаю текущую версию jdk на 1.8. Ранее наш ant-скрипт применял проверки pmd следующим образом:

<target name="check-pmd-writable-force" unless="git.scm">
        <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpath="${basedir}/tools/pmd/pmd-java-4.2.2.jar"/>
        <pmd rulesetfiles="${basedir}/tools/rulesets.xml" targetjdk="1.5">
            <formatter type="html" toFile="${basedir}/pmd_report.html" toConsole="false"/>
            <formatter type="text" toConsole="true"/>
            <fileset dir="${workmanager.dir.src}">
                <patternset refid="sources-no-tests"/>
                <custom classname="com.osm.tools.ant.AntWritableSelector" classpath="${workmanager.ant.tools}"/>
            </fileset>
        </pmd>
    </target>

Но когда я перемещаю наше приложение на jdk 1.8, pmd показывает некоторую ошибку/предупреждение, которое мне нужно устранить. Итак, я изменил сценарий ant с последними изменениями ниже:

Но это дает мне следующую ошибку:

The targetjdk attribute, if used, must be set to either '1.3', '1.4', '1.5', '1.6', '1.7' or 'jsp'

Я много искал и пытался добавить строку ниже после строки taskdef, но в итоге получил еще одну ошибку.

<sourceLanguage name="java" version="1.8"/>

Любая идея, как сделать мою вышеуказанную конфигурацию для pmd для работы с jdk 1.8


person vibhas    schedule 21.11.2017    source источник
comment
Какую версию PMD вы используете? Возможно, он слишком стар для поддержки синтаксиса Java 8 (например, Lambdas).   -  person howlger    schedule 21.11.2017
comment
Я перешел на PMD 5.8.1, но получил, что pmd не поддерживает атрибут targetjdk   -  person vibhas    schedule 22.11.2017
comment
Да, задача Ant изменилась, вместо этого используйте <sourceLanguage name="java" version="1.8"/>: pmd. github.io/pmd-5.8.1/usage/ant-task.html   -  person howlger    schedule 22.11.2017
comment
Вот что я изменил: в конфигурации выше: ‹sourceLanguage name=java version=1.8/› ‹taskdef name=pmd classname=net.sourceforge.pmd.ant.PMDTask classpath=${basedir}/tools/pmd/pmd- 5.8.1.jar/›   -  person vibhas    schedule 22.11.2017
comment
Но я вижу эту ошибку: Проблема: не удалось создать задачу или ввести исходный язык.   -  person vibhas    schedule 22.11.2017
comment
<sourceLanguage name="java" version="1.8"/> должен быть дочерним элементом <pmd>.   -  person howlger    schedule 22.11.2017


Ответы (1)


ваша проблема заключается в используемой версии PMD.

classpath="${basedir}/tools/pmd/pmd-java-4.2.2.jar"

4.2.2 — это очень старая версия (май 2008 года, целых 6 лет до того, как была выпущена Java 8). Поддержка Java 8 была добавлена ​​в PMD 5.1.0.

Вы всегда должны использовать последнюю версию PMD, чтобы убедиться, что у вас есть:

  • все новые правила
  • все исправления ошибок
  • все улучшения производительности

Последняя версия PMD — 5.8.1. Версия 6.0.0 очень близка к выпуску.

Эквивалентная конфигурация муравья для текущих версий PMD будет

<path id="pmd-classpath">
    <fileset dir="${basedir}/tools/pmd/" includes="**/*.jar"/>
</path>
<target name="check-pmd-writable-force" unless="git.scm">
    <taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd-classpath"/>
    <pmd rulesetfiles="${basedir}/tools/rulesets.xml">
        <sourceLanguage name="java" version="1.8"/>
        <formatter type="html" toFile="${basedir}/pmd_report.html" toConsole="false"/>
        <formatter type="text" toConsole="true"/>
        <fileset dir="${workmanager.dir.src}">
            <patternset refid="sources-no-tests"/>
            <custom classname="com.osm.tools.ant.AntWritableSelector" classpath="${workmanager.ant.tools}"/>
        </fileset>
    </pmd>
</target>
person Johnco    schedule 21.11.2017
comment
В результате я получил: pmd не поддерживает атрибут targetjdk. Где я упомянул targetjdk=1.8 - person vibhas; 22.11.2017
comment
Да, этот атрибут был давно удален, когда PMD перестал быть инструментом анализа только для Java, и был заменен элементом sourceLanguage. Я только что предоставил вам пример конфигурации ant, но, пожалуйста, обратитесь к документация - person Johnco; 22.11.2017