Плагин PMD Gradle: каковы приемлемые аргументы?
- Java 1.7.0_40
- ш 1.10
я никогда не использовал плагин PMD Gradle, и у меня проблемы с добавлением наборов правил в мой build.gradle
. The документация Pmd не ясно, какие допустимые значения ruleSets
есть. Их пример ruleSets = ["basic", "braces"]
и они ссылаются на "официальный список". К сожалению, здесь не на что опереться.
я угадал разделе название карты действительны каким-то образом? Как,
- " Basic (java)" - > "basic"
- " скобки (java)" -> "скобки"
но как насчет таких вещей, как " пустой код (java)"?
вот работает build.gradle
пример:
apply plugin: 'java'
apply plugin: 'pmd'
pmd {
ruleSets = [
// The first two better work since it's right in the Javadoc...
"basic",
"braces",
// This one does not work and other variations like
// "empty code", "emptycode", "empty-code", "empty_code" do not work.
"emptyCode"
]
}
repositories {
mavenCentral()
}
Gradle выплевывает следующую ошибку:
$ gradle check :pmdMain FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':pmdMain'. > Can't find resource emptyCode. Make sure the resource is a valid file or URL or is on the CLASSPATH. Here's the current classpath: /Users/kuporific/gradle/gradle-1.10/lib/gradle-launcher-1.10.jar * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 9.907 secs
работает с --stacktrace
или --debug
как было предложено, похоже, ничего не дает полезный...
Примечание: создайте пустой файл типа src/main/java/Dummy.java
. В противном случае, сборка будет получится.
как ruleSets
должно подлежит декларированию?
Edit:
оказалось, что проще объявить xml
набор правил, потому что она предлагает точный контроль над правилами. Он включен в build.gradle
вот так:
apply plugin: 'pmd'
pmd {
ruleSetFiles = files('path/to/ruleSet.xml')
}
и файл набора правил выглядит примерно так это:
Примечание: этот exaple написан для Gradle 1.10. Более новые версии Gradle (около 2.0) используют более новую версию PMD; поэтому многие из rulesets
измененными путями. Так что rulesets/logging-java.xml
в настоящее время в rulesets/java/logging-java.xml
, например.
<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="Android Application Rules"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
http://pmd.sf.net/ruleset_xml_schema.xsd" >
<rule ref="rulesets/logging-java.xml" />
<rule ref="rulesets/basic.xml" />
<rule ref="rulesets/braces.xml" />
<rule ref="rulesets/codesize.xml" >
<exclude name="TooManyMethods" />
</rule>
<rule ref="rulesets/controversial.xml">
<exclude name="UseConcurrentHashMap" />
<exclude name="AvoidLiteralsInIfCondition" />
<exclude name="DataflowAnomalyAnalysis" />
<exclude name="CallSuperInConstructor" />
<exclude name="AtLeastOneConstructor" />
<exclude name="NullAssignment" />
</rule>
<!-- etc... -->
</ruleset>
4 ответов
Я понимаю, что это огромное редактирование, но это по существу другой ответ. Поэтому, поговорив с вами и поиграв с ним, я определил, что плагин Gradle использует немного более старую версию библиотеки pmd, чем опубликована (а именно, версия 4.3); однако в плагине отсутствует несколько наборов правил, так как самая последняя версия pmd-5.0.5, которая ломается с NullPointerException
С Gradle и Java. Теперь, после написания, возможно, самого синтаксически правильного и кропотливого Hello Чтобы проверить все это, я собрал каждый набор правил Java, который работает с плагином Gradle на данный момент:
здесь главный.java:
package william;
import java.util.logging.Logger;
public final class Main{
private Main(){}
public static void main(final String [ ] args){
final Logger log = Logger.getLogger(Main.class.getName());
log.fine("Hello World");
}
}
вот сборка.Gradle в:
apply plugin: 'java'
apply plugin: 'pmd'
pmd {
ruleSets = [
"basic",
"braces",
"naming",
"android",
"clone",
"codesize",
"controversial",
"design",
"finalizers",
"imports",
"j2ee",
"javabeans",
"junit",
"logging-jakarta-commons",
"logging-java",
"migrating",
"optimizations",
"strictexception",
"strings",
"sunsecure",
"typeresolution",
"unusedcode"
]
}
repositories {
mavenCentral()
}
и теперь вам может быть интересно, какие наборы правил еще не поддерживаются? ну и ответ:
"comments"
"empty"
"unnecessary"
поверьте мне, когда я говорю, остальные правила работают безупречно. Они разорвали меня на части, когда писали Hello World. Итак, я надеюсь, что это поможет, каталог, в котором есть все наборы правил Java.xml-файлы определяются по адресу:ссылка на каталог набора правил Java GitHub pmd я игнорирую мигрирующие, потому что они не работали. Я думаю, они для чего-то конкретного.
удачи, и я бы поднял вопрос о недостающих наборах правил на форумах gradle, чтобы ходатайствовать о их добавлении или обновлении версии. Или вы может ли пользователь скомпилировать плагин и связать его с новой версией pmd, если вы действительно отчаянно нуждаетесь в отсутствующих наборах правил.
последняя версия PMD
(5.1.3
при написании этого ответа) поддерживается gradle. Наборы правил должны иметь префикс java-
при этом gradle-1.12
использовать PMD 5.1.3
С gradle следующая конфигурация определяет все возможные наборы правил, которые я мог найти:
pmd {
toolVersion = '5.1.3'
ruleSets = [
'java-android',
'java-basic',
'java-braces',
'java-clone',
'java-codesize',
'java-comments',
'java-controversial',
'java-coupling',
'java-design',
'java-empty',
'java-finalizers',
'java-imports',
'java-j2ee',
'java-javabeans',
'java-junit',
'java-logging-jakarta-commons',
'java-logging-java',
'java-migrating',
'java-naming',
'java-optimizations',
'java-strictexception',
'java-strings',
'java-sunsecure',
'java-typeresolution',
'java-unnecessary',
'java-unusedcode'
]
}
чтобы добавить к другим отличным ответам здесь. После применения pmd к вашей сборке gradle и вызова его через gradle pmdMain
, PMD jar будет загружен в ваш кэш gradle. Оттуда вы можете бежать:
find ~/.gradle -name "*pmd*.jar" -exec jar -tvf {} \;|grep rulesets
и вы получите на выходе:
0 Thu Nov 10 20:48:06 EST 2011 rulesets/
0 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/
0 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/
18068 Thu Nov 10 20:48:06 EST 2011 rulesets/naming.xml
65 Thu Nov 10 20:48:06 EST 2011 rulesets/jsprulesets.properties
710 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_15.xml
483 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_14.xml
1048 Thu Nov 10 20:48:06 EST 2011 rulesets/rulesets.properties
3017 Thu Nov 10 20:48:06 EST 2011 rulesets/javabeans.xml
2089 Thu Nov 10 20:48:06 EST 2011 rulesets/sunsecure.xml
777 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_junit4.xml
3198 Thu Nov 10 20:48:06 EST 2011 rulesets/scratchpad.xml
13190 Thu Nov 10 20:48:06 EST 2011 rulesets/strings.xml
1379 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/all-java.xml
2639 Thu Nov 10 20:48:06 EST 2011 rulesets/internal/dogfood.xml
6036 Thu Nov 10 20:48:06 EST 2011 rulesets/finalizers.xml
5347 Thu Nov 10 20:48:06 EST 2011 rulesets/logging-jakarta-commons.xml
13629 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating.xml
610 Thu Nov 10 20:48:06 EST 2011 rulesets/migrating_to_13.xml
3593 Thu Nov 10 20:48:06 EST 2011 rulesets/braces.xml
4163 Thu Nov 10 20:48:06 EST 2011 rulesets/clone.xml
702 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/33.xml
1332 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/41.xml
1009 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/35.xml
395 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/43.xml
1340 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/40rc1.xml
1110 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/34.xml
537 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/38.xml
346 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/37-jsp.xml
393 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/37.xml
744 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/39.xml
1066 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/36.xml
1256 Thu Nov 10 20:48:06 EST 2011 rulesets/releases/42.xml
6379 Thu Nov 10 20:48:06 EST 2011 rulesets/android.xml
4967 Thu Nov 10 20:48:06 EST 2011 rulesets/logging-java.xml
11557 Thu Nov 10 20:48:06 EST 2011 rulesets/j2ee.xml
52926 Thu Nov 10 20:48:06 EST 2011 rulesets/design.xml
9216 Thu Nov 10 20:48:06 EST 2011 rulesets/basic-jsp.xml
37773 Thu Nov 10 20:48:06 EST 2011 rulesets/basic.xml
3981 Thu Nov 10 20:48:06 EST 2011 rulesets/imports.xml
3836 Thu Nov 10 20:48:06 EST 2011 rulesets/typeresolution.xml
2755 Thu Nov 10 20:48:06 EST 2011 rulesets/unusedcode.xml
25043 Thu Nov 10 20:48:06 EST 2011 rulesets/controversial.xml
3045 Thu Nov 10 20:48:06 EST 2011 rulesets/coupling.xml
13379 Thu Nov 10 20:48:06 EST 2011 rulesets/strictexception.xml
12787 Thu Nov 10 20:48:06 EST 2011 rulesets/codesize.xml
12484 Thu Nov 10 20:48:06 EST 2011 rulesets/junit.xml
10784 Thu Nov 10 20:48:06 EST 2011 rulesets/optimizations.xml
1412 Thu Nov 10 20:48:06 EST 2011 rulesets/basic-jsf.xml
1396 Thu Nov 10 20:48:06 EST 2011 rulesets/favorites.xml
они не могут быть реализованы, но это хорошая отправная точка. Для описания каждого файла, вы можете проверить документацию здесь.
при использовании собственного набора правил.xml-файл, как описано в kuporific, например:
pmd {
ruleSetFiles = files('path/to/ruleSet.xml')
}
gradle 1.10 использует какие-то правила по умолчанию. Да, он жалуется, если путь к файлу неправильный, да, он жалуется, если содержимое недействительно. Но во время проверок будет применен набор правил по умолчанию. Так что я удивлен, что это сработало для тебя.
обходной путь не использовать ruleSetfiles, но ссылаться на них один за другим:
ruleSets = [ "$projectRoot/buildtools/pmd-rules/strings.xml"]