Spotbugs: gradle failed with java.lang.IllegalArgumentException: path may not be null or empty string. path='null'

Created on 30 Sep 2017  Â·  8Comments  Â·  Source: spotbugs/spotbugs

gradle failed with java.lang.IllegalArgumentException: path may not be null or empty string. path='null' when move spotbugs config to a separate gradle file and apply to project

stacktrace

java.lang.IllegalArgumentException: path may not be null or empty string. path='null' at org.gradle.api.internal.file.BaseDirFileResolver.doResolve(BaseDirFileResolver.java:72) at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:79) at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:61) at org.gradle.api.internal.tasks.CompositeTaskOutputPropertySpec$1.computeNext(CompositeTaskOutputPropertySpec.java:66) at org.gradle.api.internal.tasks.CompositeTaskOutputPropertySpec$1.computeNext(CompositeTaskOutputPropertySpec.java:56) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:542) at org.gradle.api.internal.tasks.TaskPropertyUtils.collectFileProperties(TaskPropertyUtils.java:33) at org.gradle.api.internal.tasks.DefaultTaskOutputs.getFileProperties(DefaultTaskOutputs.java:151) at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository.getOutputPropertyNamesForCacheKey(CacheBackedTaskHistoryRepository.java:148) at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository.getHistory(CacheBackedTaskHistoryRepository.java:69) at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository.getStateFor(DefaultTaskArtifactStateRepository.java:63) at org.gradle.api.internal.changedetection.changes.ShortCircuitTaskArtifactStateRepository.getStateFor(ShortCircuitTaskArtifactStateRepository.java:47) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228) at org.gradle.internal.Transformers$4.transform(Transformers.java:169) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113) at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37) at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23) at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43) at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30) at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196) at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193) at org.gradle.internal.Transformers$4.transform(Transformers.java:169) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56) at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193) at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102) at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71) at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49) at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44) at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)

file: lint.gradle

apply plugin: "com.github.spotbugs"
apply plugin: 'checkstyle'

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.github.spotbugs:gradlePlugin:1.4"
  }
}

def lintReportDir = new File(buildDir, 'reports/lint')

spotbugs {
  toolVersion = '3.1.0-RC6'
  reportsDir = lintReportDir
  effort = "max"
  reportLevel = "high"
}

task spotbugs(type: com.github.spotbugs.SpotBugsTask) {

  classes = fileTree('build/intermediates/classes/debug/')
  source = fileTree('src/main/java')
  ignoreFailures = true
  classpath = files()
  reports {
    xml.enabled true
    xml.withMessages true
  }
  excludeFilter = file("$rootProject.projectDir/config/findbugs-android-exclude.xml")
}

checkstyle {
  configFile rootProject.file('config/checkstyle.xml')
  reportsDir lintReportDir
}

task checkStyle(type: Checkstyle) {
  source fileTree('src/main/java')
  ignoreFailures true
  classpath = files()
}

project usage

apply from:"${project.rootDir}/lint.gradle"

Note: if i use Findbugs and config it in lint.gradle, it's ok to run findbugs task

Most helpful comment

@LintaoLin You missed reports.xml.destination and spotbugsClasspath in your build script.

diff --git a/lint.gradle b/lint.gradle
index 855cc47..f0fa685 100644
--- a/lint.gradle
+++ b/lint.gradle
@@ -20,7 +20,7 @@ spotbugs {
 }

 task spotbugs(type: com.github.spotbugs.SpotBugsTask) {
-
+  spotbugsClasspath = buildscript.configurations.classpath
   pluginClasspath = project.configurations.spotbugsPlugins
   classpath = files()
   classes = fileTree("$project.buildDir/intermediates/classes/debug/")
@@ -28,7 +28,8 @@ task spotbugs(type: com.github.spotbugs.SpotBugsTask) {
   ignoreFailures = true
   reports {
     xml.enabled true
+    xml.destination "$project.buildDir/reports/spotbugs.xml"
     xml.withMessages true
   }
   excludeFilter = file("$rootProject.projectDir/config/findbugs-android-exclude.xml")

All 8 comments

really strange, stacktrace does not contain our spotbugs package...

  1. please ensure that you're using gradle 4.0 or later
  2. classpath = files() seems strange, what's your purpose?
  3. try to configure Gradle plugin by spotbugs extension
  4. try to make minimum and complete gradle project which can reproduce problem

@KengoTODA

  1. gradle version is 4.1
  2. if not write classpath = files(), org.gradle.api.InvalidUserDataException: No value has been specified for property 'classpath'. will be threw;
  3. watched it before, but not help for this problem
  4. created a demo to reproduce it at CatchBug

@LintaoLin You missed reports.xml.destination and spotbugsClasspath in your build script.

diff --git a/lint.gradle b/lint.gradle
index 855cc47..f0fa685 100644
--- a/lint.gradle
+++ b/lint.gradle
@@ -20,7 +20,7 @@ spotbugs {
 }

 task spotbugs(type: com.github.spotbugs.SpotBugsTask) {
-
+  spotbugsClasspath = buildscript.configurations.classpath
   pluginClasspath = project.configurations.spotbugsPlugins
   classpath = files()
   classes = fileTree("$project.buildDir/intermediates/classes/debug/")
@@ -28,7 +28,8 @@ task spotbugs(type: com.github.spotbugs.SpotBugsTask) {
   ignoreFailures = true
   reports {
     xml.enabled true
+    xml.destination "$project.buildDir/reports/spotbugs.xml"
     xml.withMessages true
   }
   excludeFilter = file("$rootProject.projectDir/config/findbugs-android-exclude.xml")

personal note: we cannot find spotbugsMain task nor spotbugsTest task in this project, because this project does not depend on java Gradle plugin which is incompatible with android plugin. This is why we need to define task with com.github.spotbugs.SpotBugsTask type and specify all fields for it.

https://github.com/spotbugs/spotbugs/blob/3.1.0_RC6/gradlePlugin/src/main/java/com/github/spotbugs/SpotBugsPlugin.java#L36-L37

@KengoTODA this resolve my problem, thank you for patience。

@LintaoLin I found another solution, which may more simple for you.

  1. Just add sourceSets to app/build.gradle, and
  2. move task spotbugs in lint.gradle to tasks.withType in app/build.gradle

Then spotbugs gradle plugin generates spotbugsMain task and spotbugsTest task with default configuration. So you don't need to set all configurations explicitly. I've confirmed that this can generate app/build/reports/lint/main.xml and app/build/reports/lint/test.xml.

My guess is that, android gradle plugin does not configure sourceSets but java plugin does. If so, I will update document for android users.

UPDATE: my guess was right, here is related part in JavaPlugin.java

diff --git a/app/build.gradle b/app/build.gradle
index bb18146..4ba7ee9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,5 +1,18 @@
 apply plugin: 'com.android.application'

+sourceSets {
+  main {
+    java {
+      srcDirs = ['src/main/java']
+    }
+  }
+  test {
+    java {
+      srcDirs = ['src/test/java']
+    }
+  }
+}
+
 android {
   compileSdkVersion 26
   buildToolsVersion "26.0.1"
@@ -31,6 +44,17 @@ dependencies {

 apply from:"${project.rootDir}/lint.gradle"

+tasks.withType(com.github.spotbugs.SpotBugsTask) {
+  classes = fileTree("$project.buildDir/intermediates/classes/debug/")
+  ignoreFailures = true
+  reports {
+    xml.enabled true
+    xml.withMessages true
+  }
+  excludeFilter = file("$rootProject.projectDir/config/findbugs-android-exclude.xml")
+}
+

 //apply plugin: "com.github.spotbugs"
 //
diff --git a/lint.gradle b/lint.gradle
index a8b12a7..ca29901 100644
--- a/lint.gradle
+++ b/lint.gradle
@@ -18,18 +18,3 @@ spotbugs {
   effort = "max"
   reportLevel = "high"
 }
-
-task spotbugs(type: com.github.spotbugs.SpotBugsTask) {
-  spotbugsClasspath = buildscript.configurations.classpath
-  pluginClasspath = project.configurations.spotbugsPlugins
-  classpath = files()
-  classes = fileTree("$project.buildDir/intermediates/classes/debug/")
-  source = fileTree('src/main/java')
-  ignoreFailures = true
-  reports {
-    xml.enabled true
-    xml.destination "$project.buildDir/reports/spotbugs.xml"
-    xml.withMessages true
-  }
-  excludeFilter = file("$rootProject.projectDir/config/findbugs-android-exclude.xml")
-}

I tried the method you said, but it still has the error : path may not be null or empty string. path='null'. Can you help me?

gradle version is 5.1.1
created a demo to reproduce it at CatchBug

Thanks for sharing project to reproduce problems, but I'm not Android-er then I cannot use it... I personally hope that you'll propose a PR to fix.

Was this page helpful?
0 / 5 - 0 ratings