I've the following libGDX
project: https://github.com/Glusk2/sprouts
I've tried adding checkstyle
to the entire project in the root build.gradle
file, like so:
// ...
allprojects {
apply plugin: "eclipse"
apply plugin: "idea"
apply plugin: "checkstyle"
// ...
}
// ...
and added config/checkstyle/checkstyle.xml
to the root project.
But it doesn't work. I get this error after running ./gradlew build connectedCheck
:
:android:compileJava
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:3: error: package android.os does not exist
import android.os.Bundle;
^
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:9: error: cannot access Activity
public class AndroidLauncher extends AndroidApplication {
^
class file for android.app.Activity not found
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:11: error: cannot find symbol
protected void onCreate (Bundle savedInstanceState) {
^
symbol: class Bundle
location: class AndroidLauncher
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:10: error: method does not override or implement a method from a supertype
@Override
^
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:12: error: cannot find symbol
super.onCreate(savedInstanceState);
^
symbol: variable super
location: class AndroidLauncher
<path-to-project>\sprouts\android\src\com\github\glusk2\sprouts\AndroidLauncher.java:15: error: cannot find symbol
initialize(new Sprouts(), config);
^
symbol: method initialize(Sprouts,AndroidApplicationConfiguration)
location: class AndroidLauncher
6 errors
:android:compileJava FAILED
Applying the checkstyle
plugin to an Android gradle project does nothing (it adds no checkstyle tasks) by default because:
Note that the Android plugin uses its own implementation of source sets.
Android Gradle plugin; sourceSets{}
The Android plugin has its own sourceSet
concept and does not populate the sourceSet
collection of the java-base
plugin.
So applying a plugin like checkstyle
will do nothing by default.
https://issuetracker.google.com/issues/36972352#comment21
But in my case, the task list containing the string "checkstyle" looked like this:
$ ./gradlew tasks --all | grep checkstyle
android:checkstyleMain - Run Checkstyle analysis for main classes //<-- this should not be here :)
core:checkstyleMain - Run Checkstyle analysis for main classes
desktop:checkstyleMain - Run Checkstyle analysis for main classes
html:checkstyleMain - Run Checkstyle analysis for main classes
ios:checkstyleMain - Run Checkstyle analysis for main classes
core:checkstyleTest - Run Checkstyle analysis for test classes
desktop:checkstyleTest - Run Checkstyle analysis for test classes
html:checkstyleTest - Run Checkstyle analysis for test classes
ios:checkstyleTest - Run Checkstyle analysis for test classes
How come that task android:checkstyleMain
was added to the list?
It turns out this was the reason (android project build.gradle
file):
// ...
eclipse {
// ...
sourceSets {
main {
java.srcDirs "src", 'gen'
}
}
// ...
}
// ...
It set the sourceSets
that the checkstyle
plugin could detect, but configuration was obviously incomplete because the build failed for task: android:checkstyleMain
.
The above eclipse
block among others added configuration for the Eclipse ADT plugin, which has been unsupported for a while now so I've decided to remove that block altogether.
$ ./gradlew tasks --all | grep checkstyle
core:checkstyleMain - Run Checkstyle analysis for main classes
desktop:checkstyleMain - Run Checkstyle analysis for main classes
html:checkstyleMain - Run Checkstyle analysis for main classes
ios:checkstyleMain - Run Checkstyle analysis for main classes
core:checkstyleTest - Run Checkstyle analysis for test classes
desktop:checkstyleTest - Run Checkstyle analysis for test classes
html:checkstyleTest - Run Checkstyle analysis for test classes
ios:checkstyleTest - Run Checkstyle analysis for test classes
Success! But I still haven't managed to get checkstyle working with the android project.
After reading many similar questions about checkstyle tasks not showing for android projects...
- Get Android gradle plugin & checkstyle working together / command line usage
- Checkstyle Plugin does not add gradle tasks
... I've come up with the solution.
Solution
Root build.gradle
:
// ...
allprojects {
apply plugin: "eclipse"
apply plugin: "idea"
+ apply plugin: "checkstyle"
+ checkstyle {
+ configFile file("${project.rootDir}/config/checkstyle/checkstyle.xml")
+ }
// ...
}
// ...
Android build.gradle
:
+task checkstyle(type: Checkstyle) {
+ source 'src'
+ include '**/*.java'
+ exclude '**/gen/**'
+ exclude '**/R.java'
+ exclude '**/BuildConfig.java'
+ classpath = files()
+}
+check.dependsOn "checkstyle"
// ...
-// sets up the Android Eclipse project, using the old Ant based build.
-eclipse {
- // need to specify Java source sets explicitly, SpringSource Gradle Eclipse -plugin
- // ignores any nodes added in classpath.file.withXml
- sourceSets {
- main {
- java.srcDirs "src", 'gen'
- }
- }
-
- jdt {
- sourceCompatibility = 1.6
- targetCompatibility = 1.6
- }
-
- classpath {
- plusConfigurations += [ project.configurations.compile ]
- containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
- }
-
- project {
- name = appName + "-android"
- natures 'com.android.ide.eclipse.adt.AndroidNature'
- buildCommands.clear();
- buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
- buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
- buildCommand "org.eclipse.jdt.core.javabuilder"
- buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
- }
-}