Git Product home page Git Product logo

gradle-license-report's People

Contributors

aalmiray avatar adrklos avatar altro3 avatar balrok avatar benjamin-hofmann-mw avatar burtan avatar c00ler avatar chubbard avatar cristiangm avatar cstsw avatar darxriggs avatar dvaske avatar guenhter avatar jk1 avatar johnjohndoe avatar kamildoleglo avatar ligi avatar nsoft avatar patst avatar paulk-asert avatar poeschl avatar realulim avatar robertfischer avatar sarn0ld avatar sgrimm avatar smidf avatar snazy avatar stuartraetaylor avatar tinsuke avatar zee-khan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gradle-license-report's Issues

getting a StackOverflowError...

Hi,
I am new to gradle and I am evaluating if it can replace our ivy based dependency management. For this, it needs to be able to report the used licenses of all dependencies. This plugin seems exactly what I am looking for.
However, when I try to run it, I get a java.lang.StackOverflowError:

D:\DEV\gradleTest>gradlew generateLicenseReport --stacktrace
:generateLicenseReport FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':generateLicenseReport'.
> java.lang.StackOverflowError (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateLicenseReport'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:61)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:45)
        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.execute(DefaultTaskGraphExecuter.java:233)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:74)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:55)
        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$4.run(DefaultGradleLauncher.java:197)
        at org.gradle.internal.Factories$1.create(Factories.java:25)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:53)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:194)
        at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:36)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:118)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:112)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:63)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:112)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:98)
        at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:66)
        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:293)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: java.lang.StackOverflowError
        at com.github.jk1.license.reader.ConfigurationReader$ResolvedDependencyComparator.compare(ConfigurationReader.groovy:46)
        at com.github.jk1.license.reader.ConfigurationReader$ResolvedDependencyComparator.compare(ConfigurationReader.groovy)
        at java_util_Set$add$2.call(Unknown Source)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:37)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)
.....
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:39)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:39)


BUILD FAILED

Total time: 25.532 secs

Any Idea what could cause this?

(I am using gradle 3.2)

More examples and clarifications on Importers would be useful

Hello,

As I'm going through the readme of this plugin, I'm finding the information on Importers is not quite clear and it'd be useful to have some more examples/clarifications. Maybe it's not clear to me only. I'd appreciate if you could help me understand it better.

Importer adds license information from an external source to your report. Importer may come in handy if

- some modules within your application use their own means of library dependency resolution, e.g. npm registry

- your application integrates third party components or services with their own library dependencies

- joint report for a multimodule project is required

It'd be nice if you have an example of the dependency resolution using npm registry. Does this plugin automatically detect package.json file or do I need to somehow provide that info?

By default, I believe this plugin automatically generates a report for all projects. At least that's what it does for me. I have a multi module project. I applied this plugin to the root project and it is giving me a report containing dependencies of all the sub projects. I didn't use any "importer". So, not really sure what the 3rd point means by "joint report for a multimodule poject". Do you have an example?

don't display stacktrace if plugin cannot determine license

i see in gradle console useless stacktrace like :

No license file null found in /Users/henady.zakalusky/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.21/139535a69a4239db087de9bab0bee568bf8e0b70/slf4j-api-1.7.21.jar
java.lang.NullPointerException: name
at java.util.zip.ZipFile.getEntry(ZipFile.java:305)
at java_util_zip_ZipFile$getEntry$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:58)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at com.github.jk1.license.reader.ManifestReader$_findLicenseFile_closure1.doCall(ManifestReader.groovy:90)
at sun.reflect.GeneratedMethodAccessor219.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
at org.codehaus.groovy.runtime.callsite.BooleanReturningMethodInvoker.invoke(BooleanReturningMethodInvoker.java:51)
at org.codehaus.groovy.runtime.callsite.BooleanClosureWrapper.call(BooleanClosureWrapper.java:53)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.find(DefaultGroovyMethods.java:3884)
at org.codehaus.groovy.runtime.dgm$193.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at com.github.jk1.license.reader.ManifestReader.findLicenseFile(ManifestReader.groovy:85)
at com.github.jk1.license.reader.ManifestReader.this$2$findLicenseFile(ManifestReader.groovy)
at sun.reflect.GeneratedMethodAccessor260.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
at com.github.jk1.license.reader.ManifestReader.readManifestData(ManifestReader.groovy:43)
at com.github.jk1.license.reader.ManifestReader$readManifestData.call(Unknown Source)
at com.github.jk1.license.reader.ModuleReader$_read_closure1.doCall(ModuleReader.groovy:25)
at sun.reflect.GeneratedMethodAccessor247.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
at groovy.lang.Closure.call(Closure.java:426)
at groovy.lang.Closure.call(Closure.java:442)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2015)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2080)
at org.codehaus.groovy.runtime.dgm$165.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at com.github.jk1.license.reader.ModuleReader.read(ModuleReader.groovy:21)
at com.github.jk1.license.reader.ModuleReader$read.call(Unknown Source)
at com.github.jk1.license.reader.ConfigurationReader.read(ConfigurationReader.groovy:30)
at com.github.jk1.license.reader.ConfigurationReader$read.call(Unknown Source)
at com.github.jk1.license.reader.ProjectReader.read(ProjectReader.groovy:45)
at com.github.jk1.license.reader.ProjectReader$read.call(Unknown Source)
at com.github.jk1.license.task.ReportTask.generateReport(ReportTask.groovy:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:227)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
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$4.run(DefaultGradleLauncher.java:154)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
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:43)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:45)
at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:51)
at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:28)
at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:43)
at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:170)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
at org.gradle.launcher.Main.doAction(Main.java:33)
at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

[Regression in 0.7] Unable to resolve configuration :runtime

I tried to execute plugin version 0.7 on one of our internal projects, but when I executed

rm -rf build/reports && ./gradlew generateLicenseReport --info --stacktrace

โ€ฆit failed with this error:

$ rm -rf build/reports && ./gradlew generateLicenseReport --info --stacktrace
Starting Build
Settings evaluated using settings file '/Users/***/development/****/settings.gradle'.
Projects loaded. Root project using build file '/Users/***/development/****/build.gradle'.
Included projects: [root project '****']
Evaluating root project '****' using build file '/Users/***/development/****/build.gradle'.
[Asciidoctor] asciidoctorj: 1.5.3.2
[Asciidoctor] asciidoctorj-groovy-dsl: 1.0.0.preview2
Executing task ':updateVersion' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
All projects evaluated.
Selected primary task 'generateLicenseReport' from project :
Tasks to be executed: [task ':generateLicenseReport']
:generateLicenseReport (Thread[main,5,main]) started.
:generateLicenseReport
Executing task ':generateLicenseReport' (up-to-date check took 0.018 secs) due to:
  Output file /Users/***/development/****/build/reports/dependency-license has changed.
  Output file /Users/***/development/****/build/reports/dependency-license/jackson-datatype-jdk8-2.8.2.jar has been removed.
  Output file /Users/***/development/****/build/reports/dependency-license/logstash-logback-encoder-4.4.jar has been removed.
Processing dependencies for project ****
:generateLicenseReport FAILED
:generateLicenseReport (Thread[main,5,main]) completed. Took 0.062 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':generateLicenseReport'.
> Unable to resolve configurations: [configuration ':runtime']

* Try:
Run with --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateLicenseReport'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:68)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
	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$4.run(DefaultGradleLauncher.java:154)
	at org.gradle.internal.Factories$1.create(Factories.java:22)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
	at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
	at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
	at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
	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:43)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
	at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:81)
	at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:46)
	at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:51)
	at org.gradle.launcher.exec.DaemonUsageSuggestingBuildActionExecuter.execute(DaemonUsageSuggestingBuildActionExecuter.java:28)
	at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:43)
	at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:173)
	at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:241)
	at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:214)
	at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
	at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
	at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:207)
	at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
	at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
	at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
	at org.gradle.launcher.Main.doAction(Main.java:33)
	at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
	at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:55)
	at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:36)
	at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
	at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30)
	at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
	at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
Caused by: com.github.jk1.license.reader.UnresolvableConfigurationException: Unable to resolve configurations: [configuration ':runtime']
	at com.github.jk1.license.reader.ProjectReader.findConfigurationsToScan(ProjectReader.groovy:33)
	at com.github.jk1.license.reader.ProjectReader.read(ProjectReader.groovy:20)
	at com.github.jk1.license.reader.ProjectReader$read.call(Unknown Source)
	at com.github.jk1.license.ReportTask.generateReport(ReportTask.groovy:31)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:228)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:221)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
	... 60 more


BUILD FAILED

Total time: 4.552 secs
Stopped 0 compiler daemon(s).

Note that I've used asterisk * characters to mask out some internal names.

I've tested with both 0.5.1 and 0.6.1 and they both work fine. So this appears to be a regression since 0.7, potentially caused by issue #55 / PR #58 .

Normalizer can't handle license files properly

There are a few renderers (CSV, JSON, XML) which rely on the following logic:

String moduleLicense = null
String moduleLicenseUrl = null
def text = new File(config.outputDir, it).text
if (text.contains('Apache License, Version 2.0')) {
    moduleLicense = 'Apache License, Version 2.0'
    moduleLicenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0'
}
if (text.contains('Apache Software License, Version 1.1')) {
    moduleLicense = 'Apache Software License, Version 1.1'
    moduleLicenseUrl = 'http://www.apache.org/licenses/LICENSE-1.1'
}
if (text.contains('CDDL')) {
    moduleLicense = 'COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0'
    moduleLicenseUrl = 'http://opensource.org/licenses/CDDL-1.0'
}

if (moduleLicense || moduleLicenseUrl) {
    info.licenses << new License(name: moduleLicense, url: moduleLicenseUrl)
}

This makes a problem for the normalisation, because this is after normalizing.
One way to solve this, is to extend the current LicenseFileData about the fields moduleLicense and moduleLicenseUrl, and add support in the normalisation to define file-content-patterns. When a pattern machtes, the two new fields are then filled, and everything is fine.
For backward compatibility reason, the code from above stays, but is extedned with a check, so that it is only executed when the two new fields are empty.
@jk1 what do you say to that?

Grouping logical Licenses

I know this is mostly an issue with the downstream libraries, but it would be nice to be able to group together different license names into larger groups.

For instance, our report produces various strings for Apache licenses:

Apache 2
Apache 2.0
Apache License
...

I'd love to be able to create some sort of either regex or simple string matching based grouping so they can all be put together in the report.

Task is `UP-TO-DATE` when a new dependency is added

The LicenseReport task uses the getSnapshot() method to decide if the inputs have changed.

However simply adding/removing/updating a dependency on a project does not cause the getSnapshot to return a different value from before, thereby causing an incorrect license report to be generated.

Cannot exclude multiple groups

I cannot seem to be able to exclude more than one group using the excludeGroups property. I get a stackoverflow error message (see below).

This is what my configuration look like. I can specify each groups by themselves and the generated report does exclude that group, but I can't seem to specify both groups to be excluded.

licenseReport {
	excludeGroups = ['org.amimas.project1', 'org.amimas.project2']
}

Stacktrace of the error:

* What went wrong:
Execution failed for task ':generateLicenseReport'.
> java.lang.StackOverflowError (no error message)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateLicenseReport'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        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.run(DefaultTaskGraphExecuter.java:256)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:97)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:596)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.StackOverflowError
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader.collectDependencies(ConfigurationReader.groovy:70)
        at com.github.jk1.license.reader.ConfigurationReader$_collectDependencies_closure1.doCall(ConfigurationReader.groovy:70)

Can the renderers property under licenseReport extension accept keyword instead of new object

Hello,

I'm just getting started with this plugin and it's looking very interesting. One problem I ran into is that I cannot use my modularized approach for managing gradle scripts.

Currently, if we want an HTML report, after applying the plugin, this is how we should be doing configuring it.

import com.github.jk1.license.render.*

licenseReport {
    renderers = [new InventoryHtmlReportRenderer()]
}

I have my build organized in multiple gradle files. For example, I have a build.gradle under the root project. Inside this build.gradle, I have very generic configurations, such as buildScript, plugins, some variables, group name, project version, etc. After that I use apply from to include different build configurations like this:

apply from: 'gradle/coverage.gradle'
apply from: 'gradle/publishing.gradle'
apply from: 'gradle/code-quality.gradle'
apply from: 'gradle/dependency-report.gradle'

The problem with this approach comes up when I need to import any classes. For example, this plugin requires importing the render package if I want to generate different types of report as per my example above. Gradle doesn't seem to like it. I get error like this:

* What went wrong:
Could not compile script '/Users/amimas/myproject/master/gradle/dependency-license.gradle'.
> startup failed:
  script '/Users/amimas/myproject/master/gradle/dependency-license.gradle': 12: unable to resolve class InventoryHtmlReportRenderer 
   @ line 12, column 15.
        renderers = [new InventoryHtmlReportRenderer()]
                   ^
  
  1 error

The only way I can use a different renderer to generate an HTML report is if I put the configurations in the main build.gradle file where the plugin is being applied from. I haven't found any fix or workaround for this.

That's why I was thinking if it is possible for the render property to accept keywords. For example:

licenseReport {
    renderers = [inventoryHtml, xml, csv]
}

this will generate 3 reports that corresponds to those keywords. Problem with this approach is when you need to pass additional parameters/options for each of those reports.

Not sure if there are any other options.

Not Working

I am following installation for an Android project

In root build.gradle:

  1. In root build.gradle, Add
    plugins { id "com.github.jk1.dependency-license-report" version "0.3.12" apply false }
  2. In root build.gradle, Add
    subprojects { apply plugin: 'com.github.jk1.dependency-license-report' }
    3 Execute
    ./gradlew app:generateLicenseReport

Results:
This generates an empty license report in app/builds/reports/dependency-license/index.html even though I have a ton of third party dependencies.

<html>
<head>
<title>Dependency License Report for app</title>
<head>
<body>
<h1>Dependency License Report for app 0.0.1-SNAPSHOT</h1>

<hr />
<p id="timestamp">This report was generated at <em>Mon Aug 21 16:02:28 PDT 2017</em>.</p>
</body>
</html>

Expected:
The license report contains all my dependencies

Better Layout for print

Using the new InventoryHtmlReportRenderer is great when in the web browser, but Lawyers will want to print this information out and attach it to documenation/contracts/licenses, etc. So to make things simpler we should allow a layout that is print friendly as well.

Ambigous method error with 0.3.15

I integrated 0.3.15 (with the new InventoryHtmlReporter) into out of our builds, worked perfectly, no issues.

Added it to another, more complex project...failed to run

:myproject:generateLicenseReport FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':myproject:generateLicenseReport'.
> Ambiguous method overloading for method java.io.File#<init>.
  Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
        [class java.lang.String]
        [class java.net.URI]

Linux, Gradle Wrapper 4.0, Java 8

Build file config:

    licenseReport {
        renderer = new com.github.jk1.license.render.InventoryHtmlReportRenderer('third-party-license-report.html')
    }

Updated bundle json file for better grouping dependencies

The license data grouping is a very useful feature. I used the default one that comes with the plugin, but still noticed a few dependencies were not grouped properly.

For example, I had 1 dependency under each of the following groups:

  • Apache License 2.0
  • Apache License Version 2.0

Also had 2 dependencies under CDDL 1.0 and 1 dependency under Common Development and Distribution License (CDDL) v1.0

I slightly updated so that everything related Apache 2.0 gets grouped together and CDDL 1.0 related items are grouped together. Here's my bundle json file.

{
    "bundles" : [
      { "bundleName" : "apache1", "licenseName" : "Apache Software License, Version 1.1", "licenseUrl" : "http://www.apache.org/licenses/LICENSE-1.1" },
      { "bundleName" : "apache2", "licenseName" : "Apache License, Version 2.0", "licenseUrl" : "http://www.apache.org/licenses/LICENSE-2.0" },
      { "bundleName" : "bsd-2",   "licenseName" : "The 2-Clause BSD License", "licenseUrl" : "https://opensource.org/licenses/BSD-2-Clause" },
      { "bundleName" : "bsd-3",   "licenseName" : "The 3-Clause BSD License", "licenseUrl" : "https://opensource.org/licenses/BSD-3-Clause" },
      { "bundleName" : "cc0",     "licenseName" : "Creative Commons Legal Code", "licenseUrl" : "http://repository.jboss.org/licenses/cc0-1.0.txt" },
      { "bundleName" : "cddl1",   "licenseName" : "CDDL 1.0", "licenseUrl" : "http://opensource.org/licenses/CDDL-1.0" },
      { "bundleName" : "cpl-1.0", "licenseName" : "Common Public License - v 1.0", "licenseUrl" : "https://www.eclipse.org/legal/cpl-v10.html" },
      { "bundleName" : "epl1",    "licenseName" : "Eclipse Public License - v 1.0", "licenseUrl" : "http://www.eclipse.org/legal/epl-v10.html" },
      { "bundleName" : "epl2",    "licenseName" : "Eclipse Public License - v 2.0", "licenseUrl" : "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" },
      { "bundleName" : "gpl1",    "licenseName" : "GNU GENERAL PUBLIC LICENSE, Version 1", "licenseUrl" : "https://www.gnu.org/licenses/gpl-1.0" },
      { "bundleName" : "gpl2",    "licenseName" : "GNU GENERAL PUBLIC LICENSE, Version 2", "licenseUrl" : "https://www.gnu.org/licenses/gpl-2.0" },
      { "bundleName" : "gpl3",    "licenseName" : "GNU GENERAL PUBLIC LICENSE, Version 3", "licenseUrl" : "https://www.gnu.org/licenses/gpl-3.0" },
      { "bundleName" : "lgpl2.1", "licenseName" : "GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1", "licenseUrl" : "https://www.gnu.org/licenses/lgpl-2.1" },
      { "bundleName" : "lgpl3",   "licenseName" : "GNU LESSER GENERAL PUBLIC LICENSE, Version 3", "licenseUrl" : "https://www.gnu.org/licenses/lgpl-3.0" },
      { "bundleName" : "mit",     "licenseName" : "MIT License", "licenseUrl" : "https://opensource.org/licenses/MIT" },
      { "bundleName" : "mpl1.1",  "licenseName" : "Mozilla Public License Version 1.1", "licenseUrl" : "https://www.mozilla.org/en-US/MPL/1.1" },
      { "bundleName" : "mpl2",    "licenseName" : "Mozilla Public License, Version 2.0", "licenseUrl" : "https://www.mozilla.org/en-US/MPL/2.0" }
    ],
    "transformationRules" : [
      { "bundleName" : "apache2", "licenseNamePattern" : ".*The Apache Software License, Version 2.0.*" },
      { "bundleName" : "apache2", "licenseNamePattern" : "Apache License .*2.0" },
      { "bundleName" : "apache2", "licenseNamePattern" : "Apache 2.*" },
      { "bundleName" : "apache2", "licenseNamePattern" : "ASL 2.0" },
      { "bundleName" : "apache2", "licenseUrlPattern" : ".*www.apache.org/licenses/LICENSE-2.0.*" },
      { "bundleName" : "lgpl2.1", "licenseUrlPattern" : ".*www.gnu.org/licenses/old-licenses/lgpl-2.1.html" },
      { "bundleName" : "mit",     "licenseUrlPattern" : ".*www.opensource.org/licenses/mit-license.php" },
      { "bundleName" : "apache2", "licenseFileContentPattern" : ".*Apache License, Version 2.0.*" },
      { "bundleName" : "apache1", "licenseFileContentPattern" : ".*Apache Software License, Version 1.1.*" },
      { "bundleName" : "cddl1", "licenseNamePattern" : ".*CDDL.*1.0" }
    ]
}

Use all configurations dynamically

Hi,

in our current setup, we'd like to configure this plugin once in an init gradle script context. As each sub project might have different configurations set up (including custom), we'd have to configure the configuration parsing for each project individually. This is something I'd like to avoid.
My intention is to dynamically resolve all configurations and collect all dependencies. I have already poc'd this successfully.
Would this be something you'd like to integrate into your plugin? I'd be willing to submit an appropriate PR. I'd think of a clean and backwards compatible way to configure this for the task.

br
Benny

Several spurious errors when generating license report

I'm seeing several such errors when building a license report. The artifact under question group:com.thoughtworks.go, name:base, version:18.7.0-20, ext:pom is actually a gradle project in a multi-project gradle build. To avoid resolving, the group com.thoughtworks.go has been explicitly excluded in the build configuration.

Any idea why this happens, is there a work around?

Failed to retrieve artifacts for [group:com.thoughtworks.go, name:base, version:18.7.0-20, ext:pom]
org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':dependencyLicenseReport44'.
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.getFailure(DefaultLenientConfiguration.java:142)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.rethrowFailure(DefaultLenientConfiguration.java:155)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.rethrowFailure(DefaultResolvedConfiguration.java:43)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.getResolvedArtifacts(DefaultResolvedConfiguration.java:76)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolvedConfiguration.getResolvedArtifacts(ErrorHandlingConfigurationResolver.java:296)
	at sun.reflect.GeneratedMethodAccessor462.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.MethodMetaProperty$GetBeanMethodMetaProperty.getProperty(MethodMetaProperty.java:76)
	at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:64)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
	at com.github.jk1.license.util.CachingArtifactResolver.doResolveArtifact(CachingArtifactResolver.groovy:49)
	at sun.reflect.GeneratedMethodAccessor460.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.github.jk1.license.util.CachingArtifactResolver.resolveArtifacts(CachingArtifactResolver.groovy:39)
	at com.github.jk1.license.util.CachingArtifactResolver$resolveArtifacts.call(Unknown Source)
	at com.github.jk1.license.reader.PomReader.fetchRemoteArtifactPoms(PomReader.groovy:128)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:182)
	at com.github.jk1.license.reader.PomReader.fetchRemoteArtifactPom(PomReader.groovy:103)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.github.jk1.license.reader.PomReader.readPomData(PomReader.groovy:56)
	at com.github.jk1.license.reader.PomReader$readPomData.call(Unknown Source)
	at com.github.jk1.license.reader.ModuleReader$_read_closure1.doCall(ModuleReader.groovy:39)
	at sun.reflect.GeneratedMethodAccessor481.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
	at groovy.lang.Closure.call(Closure.java:414)
	at groovy.lang.Closure.call(Closure.java:430)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2040)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2025)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2090)
	at org.codehaus.groovy.runtime.dgm$166.invoke(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at com.github.jk1.license.reader.ModuleReader.read(ModuleReader.groovy:36)
	at com.github.jk1.license.reader.ModuleReader$read.call(Unknown Source)
	at com.github.jk1.license.reader.ConfigurationReader.read(ConfigurationReader.groovy:57)
	at com.github.jk1.license.reader.ConfigurationReader$read.call(Unknown Source)
	at com.github.jk1.license.reader.ProjectReader$_readConfigurationData_closure6$_closure10.doCall(ProjectReader.groovy:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
	at groovy.lang.Closure.call(Closure.java:414)
	at groovy.lang.Closure.call(Closure.java:430)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3202)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3172)
	at org.codehaus.groovy.runtime.dgm$67.invoke(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at com.github.jk1.license.reader.ProjectReader$_readConfigurationData_closure6.doCall(ProjectReader.groovy:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
	at groovy.lang.Closure.call(Closure.java:414)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.callClosureForMapEntry(DefaultGroovyMethods.java:5276)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3478)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3495)
	at org.codehaus.groovy.runtime.dgm$68.invoke(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
	at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at com.github.jk1.license.reader.ProjectReader.readConfigurationData(ProjectReader.groovy:67)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
	at com.github.jk1.license.reader.ProjectReader.read(ProjectReader.groovy:44)
	at com.github.jk1.license.reader.ProjectReader$read.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at com.github.jk1.license.ReportTask.generateReport(ReportTask.groovy:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:788)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:755)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
	at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipCachedTaskExecuter.execute(SkipCachedTaskExecuter.java:103)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:66)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
	at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
	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.run(DefaultTaskGraphExecuter.java:256)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:745)

External report cannot be imported on java 8

The issue is caused by external entity references like

<topic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://domain/help/topic.v2.xsd" id="third-party-libs">

and result in the following error:

[Fatal Error] third-party-libs-1.1.180.xml:2:85: External DTD: Failed to read external DTD 'html-entities.dtd', because 'http' access is not allowed due to restriction set by the accessExternalDTD property.

One can set the following property as a workaround:

System.setProperty("javax.xml.accessExternalDTD", "http")

Failing to retrieve artifact

Creation reports a failed retrieval because one of the dependecies contains pom with following definition of parent (org.apache.geronimo.specs:specs:1.1):

    <parent>
        <artifactId>apache</artifactId>
        <groupId>
            org.apache
        </groupId>
        <version>1</version>
    </parent>

The groupId contains spaces and new lines and it cause unsuccessful resolving of artifacts. Probably some trimming of the value missing

Failed to retrieve artifacts for [group:
            org.apache
        , name:apache, version:1, ext:pom]
org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':dependencyLicenseReport678'.
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.getFailure(DefaultLenientConfiguration.java:144)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.rethrowFailure(DefaultLenientConfiguration.java:157)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.rethrowFailure(DefaultResolvedConfiguration.java:43)
	at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.getResolvedArtifacts(DefaultResolvedConfiguration.java:76)
	at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver$ErrorHandlingResolvedConfiguration.getResolvedArtifacts(ErrorHandlingConfigurationResolver.java:296)
	at sun.reflect.GeneratedMethodAccessor153.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.MethodMetaProperty$GetBeanMethodMetaProperty.getProperty(MethodMetaProperty.java:76)
	at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:64)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
	at com.github.jk1.license.util.CachingArtifactResolver.doResolveArtifact(CachingArtifactResolver.groovy:43)

Can the report show project name for each dependencies?

I applied this plugin to my root project's build.gradle to get an aggregated report in a multi module Gradle project. It's very useful at first glance.

Then I started to notice some dependencies that I didn't recognize or they are not declared in any of Gradle project's dependencies. So, these must be transitive dependencies. It took a bit of time for me to track down which one of my dependency pulled in that particular transitive dependency.

It'd be nice if the dependency will show some additional metadata in the report:

  • Is it a transitive dependency or not
    • corresponding main dependency
  • the corresponding project name

This could get a bit complicated if multiple dependencies pulls in the same version of the same transitive dependency.

How to run in doLast {} ?

Hi,
thanks for the good plugin!

I have one question: how can I run this in doLast {} phase?

I have 3 of the following tasks:

task buildPackage1 {
  def buildDirLibs = "package1/lib/
  doLast {
    delete fileTree(buildDirLibs) { include '*.jar' }
    copy {
      from configurations.path1+ configurations.path2+ configurations.path3+ configurations.path4
      into buildDirLibs
    }
    licenseReport {
      configurations = ['path1', 'path2', 'path3', 'path4']
      renderer = new TextReportRenderer("$buildDirLibs/LICENSES.txt")
    }
  }
}

but when I run gradle buildPackage1 the generateLicenseReport task isn't executed.

The problem ist, that every of my tasks buildPackage1, buildPackage2 and buildPackage3 needs to have its own configurations object and sets a specific buildDirLibs variable.
So I need different configurations for the licenseReport.

How can I do this?

Thanks,
Tobias

XML Renderer: Cannot access last() element from an empty List

While running the plugin on one of our internal code bases, it fails when using the XML renderer, while it succeeds when I do not use any special configuration.

The configuration in the build.gradle file:

licenseReport {
    renderers = [new com.github.jk1.license.render.XmlReportRenderer()]
}

The Gradle version used is 4.6.

The command executed is:

./gradlew generateLicenseReport --info --stacktrace

The last part of the console output, including the stack trace:

:generateLicenseReport (Thread[Task worker for ':',5,main]) completed. Took 2.121 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':generateLicenseReport'.
> Cannot access last() element from an empty List

* Try:
Run with --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':generateLicenseReport'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
        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.run(DefaultTaskGraphExecuter.java:256)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.util.NoSuchElementException: Cannot access last() element from an empty List
        at com.github.jk1.license.render.LicenseDataCollector.singleModuleLicenseInfo(LicenseDataCollector.groovy:11)
        at com.github.jk1.license.render.XmlReportRenderer.printDependency(XmlReportRenderer.groovy:75)
        at com.github.jk1.license.render.XmlReportRenderer$_render_closure1.doCall(XmlReportRenderer.groovy:56)
        at com.github.jk1.license.render.XmlReportRenderer.render(XmlReportRenderer.groovy:55)
        at com.github.jk1.license.render.ReportRenderer$render.call(Unknown Source)
        at com.github.jk1.license.render.ReportRenderer$render.call(Unknown Source)
        at com.github.jk1.license.ReportTask$_generateReport_closure3.doCall(ReportTask.groovy:42)
        at com.github.jk1.license.ReportTask.generateReport(ReportTask.groovy:41)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:788)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:755)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
        ... 30 more

Provide option to customize report name

Right now it seems to be hard-coded to index.html.

When saved as an artifact in a Jenkins build, it is not very descriptive.
It would be great if there was an option to override it, e.g. "dependency-license-report.html"

Problems with pom in 'javax.mail:javax.mail-api:1.5.4'

Hi,
the plugin fails on the dependency javax.mail:javax.mail-api:1.5.4.

The problem is caused by the file:
javax.mail-1.5.4.jar\META-INF\maven\com.sun.mail\javax.mail\pom.xml

the problematic section is:

<compilerArguments>
    <Xlint:all/>
    <Xlint:-rawtypes/>
    <Xlint:-unchecked/>
       <Xlint:-finally/>
</compilerArguments> 

Gradle stops with

...
Caused by: org.xml.sax.SAXParseException; lineNumber: 116; columnNumber: 17; The prefix "Xlint" for element "Xlint:all" is not bound.
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
        at com.github.jk1.license.reader.PomReader.slurpPomFromZip(PomReader.groovy:85)
        at com.github.jk1.license.reader.PomReader.this$2$slurpPomFromZip(PomReader.groovy)
        at com.github.jk1.license.reader.PomReader$this$2$slurpPomFromZip$1.callCurrent(Unknown Source)
        at com.github.jk1.license.reader.PomReader.slurpPom(PomReader.groovy:71)
        at com.github.jk1.license.reader.PomReader.this$2$slurpPom(PomReader.groovy)
        at com.github.jk1.license.reader.PomReader$this$2$slurpPom$0.callCurrent(Unknown Source)
        at com.github.jk1.license.reader.PomReader.readPomData(PomReader.groovy:25)
        at com.github.jk1.license.reader.PomReader$readPomData.call(Unknown Source)
        at com.github.jk1.license.reader.ModuleReader$_read_closure1.doCall(ModuleReader.groovy:24)
        at com.github.jk1.license.reader.ModuleReader.read(ModuleReader.groovy:21)
        at com.github.jk1.license.reader.ModuleReader$read.call(Unknown Source)
        at com.github.jk1.license.reader.ConfigurationReader.read(ConfigurationReader.groovy:30)
        at com.github.jk1.license.reader.ConfigurationReader$read.call(Unknown Source)
        at com.github.jk1.license.reader.ProjectReader.read(ProjectReader.groovy:45)
        at com.github.jk1.license.reader.ProjectReader$read.call(Unknown Source)
        at com.github.jk1.license.task.ReportTask.generateReport(ReportTask.groovy:21)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
        ... 76 more

tested with

  • plugin '0.3.1'
  • Gradle 2.5
  • Java 1.8.51

Workaround:

licenseReport {
   excludeGroups = ['com.sun.mail'] 
}

Recent changes made plugin not portable to older versions of gradle

Recent changes to look at properties canBeResolved caused the plugin to fail on older versions of gradle. It's easy to support both the newer versions as well as older versions provided some simple guards. Add these guards and the plugin will continue to work on older versions as well as newer.

Task output is not set

Instead of setting the value outputDir I would recommend to use the 'output.dir'-property. This would enable the output of generateLicenseReport to be used for other tasks, e.g.:

distributions{
  main {
    contents {
      from(generateLicenseReport) {
        into 'license'
      }
    }
  }
}

Currently I need to do it this way in my script:

afterEvaluate {
  generateLicenseReport {
    outputs.dir licenseReport.outputDir
  }
}

https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:task_inputs_outputs

Unable to run with gradle 4.6

I see the following stacktrace in gradle 4.6 with the following configuration snippet.

The configuration is simply:

  licenseReport {
    filters = new LicenseBundleNormalizer(bundlePath: rootProject.file('buildSrc/license-normalizer-bundle.json'))
  }
Caused by: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.github.jk1.license.filter.LicenseBundleNormalizer$NormalizerLicenseBundle(com.github.jk1.license.filter.LicenseBundleNormalizer, groovy.json.internal.LazyValueMap)
        at com.github.jk1.license.filter.LicenseBundleNormalizer$_toConfig_closure15.doCall(LicenseBundleNormalizer.groovy:174)
        at com.github.jk1.license.filter.LicenseBundleNormalizer.toConfig(LicenseBundleNormalizer.groovy:174)
        at com.github.jk1.license.filter.LicenseBundleNormalizer.<init>(LicenseBundleNormalizer.groovy:52)
        at com.github.jk1.license.filter.LicenseBundleNormalizer.<init>(LicenseBundleNormalizer.groovy:41)
        at build_edej6x7wnrn759o1j0g7wr23f$_run_closure6$_closure23.doCall(/Users/ketanpadegaonkar/projects/gocd/gocd/build.gradle:283)
        at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
        at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
        at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
        at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
        at org.gradle.api.internal.plugins.ExtensionsStorage$ExtensionHolder.configure(ExtensionsStorage.java:183)
        at org.gradle.api.internal.plugins.ExtensionsStorage.configureExtension(ExtensionsStorage.java:67)
        at org.gradle.api.internal.plugins.DefaultConvention.configureExtension(DefaultConvention.java:399)
        at org.gradle.api.internal.plugins.DefaultConvention.access$500(DefaultConvention.java:45)
        at org.gradle.api.internal.plugins.DefaultConvention$ExtensionsDynamicObject.tryInvokeMethod(DefaultConvention.java:336)
        at org.gradle.internal.metaobject.CompositeDynamicObject.tryInvokeMethod(CompositeDynamicObject.java:98)
        at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.tryInvokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
        at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:57)
        at build_edej6x7wnrn759o1j0g7wr23f$_run_closure6.doCall(/Users/ketanpadegaonkar/projects/gocd/gocd/build.gradle:282)
        at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)

JsonReportRenderer Bug?

Hi,
I think there is a bug in the JsonReportRenderer.groovy.
If one uses customer importers, only the last module entry is included in the Json output and not all.

Problem seems to me the method:
static def readModuleDependencies(def modules)
I think it should call
modules.collect
and not
modules.collectEntries
(The contents of modules is a treeset of ImportedModuleData, not a map)
(or is my importer wrong?)

Tasks offered by the plugin should have a group and description

It'd be nice if the plugin's tasks show up when executing gradlew tasks. At the moment, that command doesn't show the one and only task generateLicenseReport in the output. Having the task listed there is useful if you happen to forget the task name. You can look it up directly from this list. Note that the task name will show if you run gradlew tasks --all, which can be a very large list and will include tasks from all subprojects.

Ideally, I think this task should be listed under the group Reporting tasks. If you apply Gradle's built-in plugin such as: buildDashboard, project-report, etc. they are currently listed under that group name.

I think it's a matter of updating the following file and using the constructor to call setDescription and setGroup methods.

Gradle-License-Report/src/main/groovy/com/github/jk1/license/ReportTask.groovy

Throwing exceptions during report generation looking for non-existent dependencies

In our corporate environment, we cannot point to Maven Central, so we point all of our Gradle builds to a local Artifactory with just approved libraries that passed legal license reviews.

On one of our projects we get multiple exceptions during the report generation ./gradlew my-service:generateLicenseReport, e.g.

Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find org.apache.axis2:axis2-parent:1.4.1.
Required by:
    project :my-service
        at org.gradle.internal.resolve.result.DefaultBuildableComponentResolveResult.notFound(DefaultBuildableComponentResolveResult.java:38)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolveModule(RepositoryChainComponentMetaDataResolver.java:105)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver.resolve(RepositoryChainComponentMetaDataResolver.java:60)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ComponentMetaDataResolverChain.resolve(ComponentResolversChain.java:93)
        at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModuleResolver.resolve(ClientModuleResolver.java:45)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ComponentState.resolve(DependencyGraphBuilder.java:854)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ComponentState.getMetaData(DependencyGraphBuilder.java:865)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$EdgeState.calculateTargetConfigurations(DependencyGraphBuilder.java:446)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$EdgeState.attachToTargetConfigurations(DependencyGraphBuilder.java:417)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:223)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:213)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:148)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:121)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:86)
        at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:138)
        at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:73)
        at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:66)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$4.run(DefaultConfiguration.java:469)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:95)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:461)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:437)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:429)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor282.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:59)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:228)
        at org.gradle.internal.metaobject.BeanDynamicObject.tryGetProperty(BeanDynamicObject.java:171)
        at org.gradle.internal.metaobject.CompositeDynamicObject.tryGetProperty(CompositeDynamicObject.java:55)
        at org.gradle.internal.metaobject.AbstractDynamicObject.getProperty(AbstractDynamicObject.java:59)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getProperty(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:50)
        ... 100 more

But that dependency is not defined in our list.
I can prove it by scanning for it:

./gradlew my-service:dependencies | grep axis2-parent

Nothing shows up.

We have the same problem for yet another library:

Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.sun.codemodel:codemodel-project:2.6.
Required by:
    project :my-service
        at org.gradle.internal.resolve.result.DefaultBuildableComponentResolveResult.notFound(DefaultBuildableComponentResolveResult.java:38)

Once again, com.sun.codemodel:codemodel-project is nowhere to be found in the dependencies for our entire project. So no idea why the plugin is trying to look for it. Since the build points to Artifactory, those libraries are not there (further proof that we do not depend on them...our build machines are locked down from Internet and can only pull libs from Artifactory, due to SOC2 regulations).

I tried excluding both of these:

excludes = ['org.apache.axis2:axis2-parent','com.sun.codemodel:codemodel-project']

made no difference. The excludes got ignored. Still same error.

This is 0.3.16, using Gradle Wrapper 4.0

Report for multi module gradle project does not exclude project's own group by default

Hello,

I've got a multi-module gradle project. I applied this plugin using the plugins block to my root project's build.gradle

plugins {
	id 'org.sonarqube' version '2.6.2'
	id 'com.github.jk1.dependency-license-report' version '1.1'
}

I didn't make any other configurations using licenseReport extension as the default configuration in the ReadMe seemed good enough for me. When I run sh gradlew generateLicenseReport, I get a lot of error stacktrace like this:

Failed to retrieve artifacts for [group:org.amimas.myproject, name:sample-lib, version:2.0-SNAPSHOT, ext:pom]
org.gradle.internal.resolve.ArtifactNotFoundException: Could not find sample-lib.pom (project :sample-lib).
        at org.gradle.internal.resolve.result.DefaultBuildableArtifactResolveResult.notFound(DefaultBuildableArtifactResolveResult.java:27)
        at org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectDependencyResolver.resolveArtifact(ProjectDependencyResolver.java:147)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ArtifactResolverChain.resolveArtifact(ComponentResolversChain.java:122)
        at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingArtifactResolver.resolveArtifact(ErrorHandlingArtifactResolver.java:46)
        at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.DefaultArtifactSet$LazyArtifactSource.create(DefaultArtifactSet.java:171)

The report is still generated under the root project ($buildDir/reports/dependency-license) and it contains 1 liner like the following (one for each gradle subproject), along with actual report of all the dependencies.

24. Group: org.amimas.myproject Name: sample-lib Version: 2.0-SNAPSHOT

I then added the following to my root project's build.gradle

licenseReport {
	excludeGroups = ['org.amimas.myproject']
}

Now when I run sh gradlew generateLicenseReport, I don't get those stacktrace/errors anymore and the report is actually ignoring the group.

Based on the readme, I believe the plugin is supposed to ignore the project's own group by default. Am I missing any configuration? I have the following in my root project's build.gradle:

group = 'org.amimas.myproject'

allprojects {
    group = rootProject.group
}

Next Release to Gradle Repository

@jk1 I was wondering when you'd be releasing the next version of the plugin to the repository. Currently, I'm using it from the buildSrc with my changes locally but would love to use it from the repository with the recent changes.

Project does not correctly apply the Apache-2.0 License

The Apache License that has been added to this project has an appendix, which describes how to apply the license to a body of work; these instructions are not followed.

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

  Copyright {yyyy} {name of copyright owner}

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-- LICENSE@a431d180:178-201

Disclaimer: I am not a lawyer.

As the source from which this project was forked was released into the public domain under the Unlicense, it inherits no copyright claims, and the copyright clause in the license application should be that of the maintainer of this project.

Support for Android implementation dependencies configuration

Hi,
the current Android tooling prescribes usage of an implementation configuration for dependencies, see Migrate dependency configurations for local modules:

dependencies {

    // Instead, simply use the following to take advantage of
    // variant-aware dependency resolution. You can learn more about
    // the 'implementation' configuration in the section about
    // new dependency configurations.
    implementation project(':library')
}

I'm trying to create a report on this configuration by using the following licenseReport configuration:

licenseReport {
	configurations = ['implementation']
}

gradle-license-report unfortunately cannot process this configuration, as configuration.canBeResolved returns false in ProjectReader line 30.

The resulting error message is:

Project Reader: The specified configuration "implementation" can't be resolved. Try specifying a more specific configuration by adding flavor(s) and/or build type.

Is there a way of fixing this in the licenseReport configuration, or would it be possible to directly support this in code?

Submodule artifacts are built when ReportTask is executed

Plugin version: 1.2

Prerequisites

  1. Checkout gradle project which has com.github.jk1.dependency-license-report applied
  2. Execute the ReportTask

Expected behaviour

  1. The report is generated

Observed behaviour

  1. The artifacts from the submodules are built (:compileJava and :jar tasks are executed)
  2. The report is generated and contains data about the artifacts generated in step 3

Probable cause

When c6aed1d is reverted, the issue apparently disappears.

The issue also disappears for some configurations values. For example, the issue occurs with configurations = ['compile'] or ['runtime'], but not with ['test'] in my particular setting.

CachingArtifactResolver searches for non-existing .pom1 files when used within Atlassian Bamboo

When running within Atlassian Bamboo the CachingArtifactResolver searches for (of cause) non-existing .pom1 files and therefore fails the build.

See example:

build	22-Feb-2018 10:11:42	10:11:42.923 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Detected non-existence of artifact 'logback-parent.pom1 (ch.qos.logback:logback-parent:1.2.3)' in resolver cache
build	22-Feb-2018 10:11:42	10:11:42.924 [DEBUG] [com.github.jk1.license.ReportTask] Failed to retrieve parent artifact [group:ch.qos.logback, name:logback-parent, version:1.2.3, ext:pom1]
build	22-Feb-2018 10:11:42	org.gradle.internal.resolve.ArtifactNotFoundException: Could not find logback-parent.pom1 (ch.qos.logback:logback-parent:1.2.3).
build	22-Feb-2018 10:11:42	Searched in the following locations:
build	22-Feb-2018 10:11:42	     #http://XXX.de/artifactory/XXXX/ch/qos/logback/logback-parent/1.2.3/logback-parent-1.2.3.pom1
build	22-Feb-2018 10:11:42		at org.gradle.internal.resolve.result.DefaultBuildableArtifactResolveResult.notFound(DefaultBuildableArtifactResolveResult.java:27)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveArtifactFromCache(CachingModuleComponentRepository.java:324)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveArtifact(CachingModuleComponentRepository.java:274)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.BaseModuleComponentRepositoryAccess.resolveArtifact(BaseModuleComponentRepositoryAccess.java:65)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMemoryCachedModuleComponentRepository$CachedAccess.resolveArtifact(InMemoryCachedModuleComponentRepository.java:124)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveArtifact(ErrorHandlingModuleComponentRepository.java:174)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainArtifactResolver.resolveArtifact(RepositoryChainArtifactResolver.java:78)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.resolveengine.ComponentResolversChain$ArtifactResolverChain.resolveArtifact(ComponentResolversChain.java:121)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingArtifactResolver.resolveArtifact(ErrorHandlingArtifactResolver.java:46)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.DefaultArtifactSet$LazyArtifactSource.create(DefaultArtifactSet.java:170)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.DefaultArtifactSet$LazyArtifactSource.create(DefaultArtifactSet.java:157)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.DefaultResolvedArtifact.getFile(DefaultResolvedArtifact.java:135)
build	22-Feb-2018 10:11:42		at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ResolvableArtifact$getFile.call(Unknown Source)
build	22-Feb-2018 10:11:42		at com.github.jk1.license.util.CachingArtifactResolver.doResolveArtifact(CachingArtifactResolver.groovy:38)

When running on the command line it works without errors.

Remark (the artifactory server URL has been partly anonymized by XXXX)

Add support for multiple reporters

Either add MultiReportRenderer or change to licenseReport.renderers

public class MultiReportRenderer implements ReportRenderer {

    private ReportRenderer[] renderers = {};

    public MultiReportRenderer(ReportRenderer... renderers) {
        this.renderers = renderers;
    }

    public void render(ProjectData data) {
        if (renderers == null || renderers.length == 0) return;

        for (ReportRenderer renderer : renderers) {
            renderer.render(data);
        }
    }

}

Missing detailed documentation for using buildscript style

Since this is a fork the forked version includes documentation for plugin { id } style syntax and includes how to include it in a buildscript. The buildscript syntax is important because in multi-module projects you can provide this configuration in a single location and apply it to all sub-projects. The problem with the lack of documentation is figuring out the dependency group/name/version strings. I'll cut to the chase:

buildscript {
   repositories {
        jcenter()
   }

   dependencies {
       classpath 'gradle.plugin.com.github.jk1:gradle-license-report:0.3.12'
   }
}
apply plugin: 'com.github.jk1.dependency-license-report'

This would be really nice to add to the README.md so it's easier to leverage it.

Hundred of Configurations trigger Artifactory Build Info Issue

To resolve the dependencies, the plugin created a Gradle Configuration for every dependency in class CachingArtifactResolver. This results in hundreds of scopes of type POM laying arround after the generateLicenseReport task.
We also use the Artifactory plugins org.jfrog.buildinfo:build-info-*.
Artifactory analyze all scopes of a build and safe the information in an internal Database, comma-separated in one field. So, the great dimension of this scopes-string triggers an exception in Artifactory when the length exceeds the max field length in the database.

Our workaround was to implement a generateLicenseReport.doLast which remove all configurations with name dependencyLicenseReport* from ConfigurationContainer in the hope, there are no side effects, doing this.

Reporting does not work with composite builds

In our project we have a composite build that we import.

When the license report hits this it tries to look it up in maven even through it's a composite build.

I have tried to exclude the group/module using both excludeGroups and excludes

Error log attached.
error.log

Add text from additional file to Json

It would be really nice, if we could have functionality to insert the "Notice.txt" and license files text into a Json field, so it gets easy to just parse the Json and get the text from there.

What do you think about that?

build fails with org.ehcache:ehcache:3.3.1 dependency

Steps to reproduce:

  • Add compile dependency org.ehcache:ehcache:3.3.1 in build script (e.g. build.gradle)
  • ensure plugin dependency-license-report version is 0.3.12
  • run gradle generateLicenseReport to generate report
  • build error message Execution failed for task ':generateLicenseReport'. > No such property: path for class: com.github.jk1.license.render.SimpleHtmlReportRenderer

License bundle normalizer creates duplicate entries in report

With the following in my build.gradle:

plugins {
    id 'com.github.jk1.dependency-license-report' version '0.6'
}
import com.github.jk1.license.render.*
import com.github.jk1.license.filter.*
licenseReport {
    filters = [ new LicenseBundleNormalizer("config/license-normalizer-bundle.json") ]
    renderer = new InventoryHtmlReportRenderer()
}

[snip]
dependencies {
    compile 'joda-time:joda-time:2.9.7'
[snip]
}
[snip]

and the following in config/license-normalizer-bundle.json:

{
  "bundles" : [
    { "bundleName" : "apache2", "licenseName" : "Apache License, Version 2.0", "licenseUrl" : "http://www.apache.org/licenses/LICENSE-2.0" }
  ],
  "transformationRules" : [
    { "bundleName" : "apache2", "licenseNamePattern" : "Apache 2.*" }
  ]
}

I find that joda-time appears twice in the generated index.html: once under "Apache 2", and once under "Apache License, Version 2.0". I expected it to appear only once, under "Apache License, Version 2.0". The same thing happens if I use CsvReportRenderer instead of InventoryHtmlReportRenderer.

Is the above adequate to reproduce the problem? If not, I can try to create a more complete reproducer.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.