Giter VIP home page Giter VIP logo

gradle-jnlp-plugin's Introduction

Build Status Coverage Status

Gradle plugin to create webstart files

To use in a griffon 2 application add following to your build.gradle:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'de.gliderpilot.gradle.jnlp:gradle-jnlp-plugin:+'
    }
}

apply plugin: 'de.gliderpilot.jnlp'

jnlp {
    useVersions = true
    withXml {
        information {
            title project.name
            vendor project.group ?: project.name
        }
        security {
            'all-permissions'()
        }
    }
    signJarParams = [alias: 'myalias', storepass: 'mystorepass']
}

task genkey << {
    ant.genkey(alias: 'myalias', storepass: 'mystorepass', dname: 'CN=Ant Group, OU=Jakarta Division, O=Apache.org, C=US')
}

Than execute

./gradlew genkey

followed by

./gradlew createWebstart

which will create webstart files at build/jnlp.

To launch the application with webstart, call javaws build/jnlp/launch.jnlp (you must first set your java security settings to medium, or use a real certificate).

gradle-jnlp-plugin's People

Contributors

aalmiray avatar brianpreuss avatar ilsaul avatar timyates avatar tschulte avatar

Stargazers

 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

gradle-jnlp-plugin's Issues

jardiff is not incremental

When building a -SNAPSHOT version and changing the source version for the jardiff, the old jardiff files will also be packed in the war file, making it necessary to do a clean.

Changing the source version of a jardiff should not require a clean build.

signJars task broken on Gradle 3.0

Trying to run signJars with Gradle 3.0 gives an error:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':signJars'.
> No such property: parallelThreadCount for class: org.gradle.StartParameter

The cause is that parallelThreadCount was deprecated and has been removed in Gradle 3.0. The docs recommend getMaxWorkerCount or isParallelProjectExecutionEnabled instead.

build path

Hi,
sorry for so many questions, but I would like to help you make a better plugin

you use tmp under build, can you set by default a better path?

I suggest build/webstart

thx

Enable JarDiff-Download using JnlpDownloadServlet

The plugin currently supports everything necessary to best support Java Webstart for Java 7 and newer without the need for a specialized download servlet (which was required prior Java 7 to achive the same functionality).

=> http://docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/bestPractices.html

Part of the best practices mentioned in the above link are not in the scope of this plugin: Everything that has to be done in the HTML file must be done by the project using this plugin.

This is especially true for the codebase attribute. You either have to hard-code the codebase in the build.gradle to the value of the server, follow http://docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/deployingWithoutCodebase.html (i.e. create a HTML file containing some javascript), or use the download servlet (which is not directly supported right now).

But one last piece is missing: the JnlpDownloadServlet does support JarDiff download to further reduce the download. This is not possible using just client side techniques available till Java 7.

The purpose of this issue can be split in two parts:

Investigate possibilities of Java Webstart regarding JarDiff/Pack200

  • What is JarDiff (File format, etc.)? It seems, the JarDiff is just a jar file (http://www.informit.com/articles/article.aspx?p=25044&seqNum=6)
  • Can JarDiff be combined with Pack200? Since a JarDiff is just a jar file, I would hope this to be true, but it must be checked if this is supported by the Webstart client
  • What gains can be expected

If it is worth it, implement JarDiff support

This only makes sense when creating a war file. Therefore, this would only work for war projects, i.e. projects with plugin 'war' applied

  • Automatically (maybe configured using the extension) add a dependency to the JnlpDownloadServlet
  • don't generate jnlp.packEnabled and jnlp.versionEnabled properties in the jnlp (this must be handled by the servlet instead of the client in that case)
  • Configure the old version(s) to also be included

Either by defining a dependency on both the new version and the old version(s) of the application

configurations {
    jnlpV1
    jnlpV2
    // ...
}
dependencies {
    jnlp 'group:artifact:v3'
    jnlpV1 'group:artifact:v1'
    jnlpV2 'group:artifact:v1'
}

The plugin would collect all dependencies from configurations which name startsWith 'jnlp' and put all the jars signed and packed and versioned in the lib directory.

Or by defining a dependency on both the new version of the application and the old version(s) of the war
This may be a special case of the above, but instead of defining a dependency for jnlpV1 on the application with an older version, there would be a dependency on an older version of the war. In that case the plugin would not have to sign and pack the jars, because the war does already contain signed and packed jars.

Warning when running with Gradle 5.0

When executing tasks from this plugin I get the following message:

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.0/userguide/command_line_interface.html#sec:command_line_warnings

With ./gradlew assembleWebstartDist --warning-mode all --debug --stacktrace I get the following stack trace:

10:11:18.286 [WARN] [org.gradle.internal.featurelifecycle.LoggingDeprecatedFeatureHandler] The configuration :jnlp was resolved without accessing the project in a safe manner.  This may happen when a configuration is resolved from a thread not managed by Gradle or from a different project.  See https://docs.gradle.org/5.0/userguide/troubleshooting_dependency_resolution.html#configuration_resolution_constraints for more details. This behaviour has been deprecated and is scheduled to be removed in Gradle 6.0.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:521)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:511)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor66.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:104)
        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:49)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:298)
        at de.gliderpilot.gradle.jnlp.AbstractCopyJarsTask.newName(AbstractCopyJarsTask.groovy:33)
        at de.gliderpilot.gradle.jnlp.AbstractCopyJarsTask$newName$5.callCurrent(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:156)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
        at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest(SignJarsTask.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:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:104)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:326)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:352)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:68)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:168)
        at de.gliderpilot.gradle.jnlp.SignJarsTask$_signJars_closure3$_closure10.doCall(SignJarsTask.groovy:46)
        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.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:104)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:326)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at groovyx.gpars.pa.GParsPoolUtilHelper$_eachParallelPA_closure8.doCall(GParsPoolUtilHelper.groovy:192)
        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.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:104)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:326)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:411)
        at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:50)
        at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:122)
        at com.sun.proxy.$Proxy64.op(Unknown Source)
        at groovyx.gpars.extra166y.AbstractParallelAnyArray$OUPap.leafApply(AbstractParallelAnyArray.java:640)
        at groovyx.gpars.extra166y.PAS$FJOApply.atLeaf(PAS.java:147)
        at groovyx.gpars.extra166y.PAS$FJBase.internalCompute(PAS.java:118)
        at groovyx.gpars.extra166y.PAS$FJBase.compute(PAS.java:106)
        at jsr166y.RecursiveAction.exec(RecursiveAction.java:148)
        at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:305)
        at jsr166y.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:575)
        at jsr166y.ForkJoinPool.scan(ForkJoinPool.java:733)
        at jsr166y.ForkJoinPool.work(ForkJoinPool.java:617)
        at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:369)

I think the issue must be within the plugin rather than in my code, but please correct me if I'm wrong.

SignJarsTask is not fully incremental

SignJars uses IncrementalTaskInputs, but only implements the incremental case, i.e. if inputs.incremental == true

If the task inputs have changed, and the build is run with --rerun-tasks, old files stay in the output folder, i.e. are not removed.

jnlp-war plugin does not work with gradle 4.0

When using gradle 4.0, I get the following error:

Caused by: org.gradle.api.GradleException: You cannot add child specs at execution time. Consider configuring this task during configuration time or using a separate task to do the configuration.
[...]
        at org.gradle.api.file.CopySpec$from$0.call(Unknown Source)
        at de.gliderpilot.gradle.jnlp.war.GradleJnlpWarPluginExtension$Launcher.resolve(GradleJnlpWarPluginExtension.groovy:182)
        at de.gliderpilot.gradle.jnlp.war.GradleJnlpWarPluginExtension$_closure4_closure10.doCall(GradleJnlpWarPluginExtension.groovy:93)

How to publish a private version of plugin to a private artifactory server

I need to build my own private version of this plugin and publish it to my private artifactory repo. For context see:

#36

I tried the following:

gradlew -i -s -Pversion=1.0.1-fnajmi publishPlugins

I get the exception:

Caused by: java.lang.RuntimeException: Invalid version '1.0.1-develop-SNAPSHOT'. Set 'version' property string must with a string that: 1) is more than 1 and less than 20 characters long; 2) includes a number; and 3) that matches the regular expression: [a-zA-Z0-9\-\.\[\]\:\+]*
	at com.gradle.publish.PluginPublishValidator.validateVersion(PluginPublishValidator.java:157)
	at com.gradle.publish.PluginPublishValidator.validatePluginConfig(PluginPublishValidator.java:127)
	at com.gradle.publish.PluginPublishValidator.validateBundle(PluginPublishValidator.java:91)
	at com.gradle.publish.PublishTask.publish(PublishTask.java:48)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:226)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
	at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:589)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:572)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
	... 57 more

It seems it is due to the de.gliderpilot.semantic-release plugin not allowing me to do so. Also when I pub

I am looking for answers to the following:

  • How can I bypass de.gliderpilot.semantic-release plugin and set my own version

  • How can I deploy the plugin to my private artifcatory.

It would be nice to have some documentation targeted for developers of the project where this info can be kept.

I am really stuck and would appreciate some help or else I will have to unwind a lot of work to use this plugin and go back to the dark ages of manually assembling the jnlp package.

FailedDownloadException on launch

Hi,
i just tried your plugin, where signing and copying to the right place seems to work fine.
But when invoking launch.jnlp i get the mentioned exception for the first library in the launch file:

com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/Users/xyz/Development/java/project/mainapp/build/jnlp/lib/joda-time__V2.7.jar

The file can be found in lib dir with the name joda-time__V2.7.jar.pack.gz
Also when i change the href to

<jar href='lib/joda-time__V2.7.jar.pack.gz' />

i get the same error.
Is there something else needed to start the application ?
I'm working on OS X.

Thank you!

EDIT: Ok this is not a problem, the app has to be started with an URL and cannot be opened from console!

System.getProperty("java.home") should have the precedence over $JAVA_HOME (at least Gradle itself does this)

Please see: #33 (comment)

If Gradle finds the java.home system property set (for example by virtue of org.gradle.java.home property set on $GRADLE_USER_HOME/gradle.properties), it uses this to locate the Java compiler to use to compile Java sources, instead of $JAVA_HOME.

I think the jnlp plugin should do the same to run the Pack200 executable. This should ensure better consistency between compilation and post-processing of signed JAR files for packing purposes.

Right now, it does exactly the opposite ($JAVA_HOME takes precedence).

Implement pack200 support

usePack200 is already a config option in the extension, and does already result in the correct option being set in the jnlp, but the jars are not packed yet.

JavaFX preloader support

I am wondering if it is possible create a JNLP file that specifies the JavaFX preloader class as described in http://docs.oracle.com/javafx/2/deployment/preloaders.htm#BABJDJDJ.

If I understand the specification corretly, the relevant JNLP entries are:
<jar href="lib/MyPreloader.jar" size="2801" **download="progress"** />
And:
<jfx:javafx-desc main-class="com.example.MyMainClass" **preloader-class="com.example.MyPreloaderClass"**/>
It is supposed that MyPreloader.jar contains com.example.MyPreloaderClass

I was able to generate a custom jfx:javafx-desc instead of default application-desc.
But I could not figure out how to add download="progress" to the jar entry.

Support query string in href

Right now, when using this:

jnlp {
  href 'start.jnlp'
}

you change both the name of the generated JNLP file and the contents of the href attribute of the generated jnlp element.

But I need to add a query string to the href attribute value. This requires me to implement some post-processing to the result of JnlpDownloadServlet through a filter to add the missing query string at runtime.

Exclude some signed jar(s)?

Hello, new here with Gradle AND gradle-jnlp-plugin.
I'm trying to use your plugin to sign my jar, and I'm getting

java.lang.SecurityException: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

I believe this is caused by some of the jar(s) I'm using have already been signed (probably bouncycastle stuff?) Is there a way to tell your plugin to exclude some of the jar(s)? Or what is the proper way to handle this case?

Here is my jnlp settings:

jnlp {
    useVersions = true
    usePack200 = true
    mainClassName = 'blah.blah.Main'
    withXml {
        information {
            title 'Blah'
            vendor 'Blah'
        }
        security {
            'all-permissions'()
        }
    }
    signJarParams = [keystore: 'jks/local.jks', alias: 'test', storepass: 'password']
}

jar {
  	configurations.runtime.files.each {
  		from zipTree(it)
  	}
  	manifest {
    	attributes('Class-Path': configurations.runtime.files.collect { it.getName() }.join(' '))
  	}
  
}

PS: Is there a place to ask questions related to your plugin (instead of opening an issue)?

introduce config option to clean all named sections in Manifest.MF

Hello Tobias!

I use your plugin in my Java WebStart project. Thanks a lot for your work!

Today I have problems with the MANIFEST in one special jar:
http://search.maven.org/#artifactdetails|commons-httpclient|commons-httpclient|3.1|jar

The problem is line 7: "Name: org/apache...". This leads to a verification-error in the WebStart-client.
Could you please try to reproduce the problem and give me any hint how to
handle this? I already tried:

signJarRemovedManifestEntries = '(?:Trusted-Only|Trusted-Library|.*-Digest|Name|Build-By)'

but this does not help.

Thanks a lot in advance,
Tobias Otto

Allow to specify a subfolder where to put the launched application in jnlp-war plugin

See: #45 (comment)

I would like to specify a subfolder in the WAR where the generated jnlp file and lib folder are put.

That is, I would like to be able to get the following structure (let 'subfolder' be this subfolder name and ria the name of the RIA project):

META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/lib/
WEB-INF/lib/jnlp-servlet-1.2.2.jar
WEB-INF/lib/javax.servlet-api-3.1.0.jar
WEB-INF/lib/javax.websocket-api-1.0.jar
subfolder/launch.jnlp
subfolder/lib/
subfolder/lib/ria__V1.1.0.jar.pack.gz
subfolder/lib/ria__V1.0.0__V1.1.0.diff.jar.pack.gz

Jardiff broken when using pack200

#19 introduced jardiff support and packing the jardiff using pack200. But there is an issue with packing jardiff files. #31 tried to fix that issue.

But that fix is still flawed. The fix was to first do a pack200 --repack followed by the actual pack200. But because the repack works on the original file, the resulting jardiff file might already be broken. The second call to pack200 only fails, because pack200 seems to check the signatures. But I don't know if that is reliable.

The problem is that pack200 is a lossy compression algorithm. It alters the .class files. But altering the class files breaks the signing. That's why it is essential to first pack and unpack again (as pack200 --repack), then sign, then pack again. The last pack will not alter the .class files, because they are already altered by the first call to pack200.

But when signing a jardiff file, pack200 sometimes does alter .class files, although they have already been processed by pack200. But since they are now in a new jar file, they are altered again.

A quick fix might be to do the initial repack of the jardiff file on a temporary file, to not loose the original file. But that might be too short sighted. I think I need to investigate further if it is really possible to pack jardiff files without altering the .class files, and if so, how.

Allow changing of the used certificate

Currently, if between two versions of an application the certificate changes, e.g. because you finally get an official certificate, users of the application have to clear their java cache. This is because webstart will not allow starting the application if the jars are signed using different certificates.

To prevent this, the keystore alias should be appended to the version attribute, or alternatively an user specified postfix.

Dependencies with transitive dependencies of type pom cause build exception

When there is a dependency which has a transitive dependency of type pom, this causes a build exception. This can also be reproduced by depending on the pom directly.

When having following dependency

dependencies {
    jnlp 'log4j:log4j:1.2.17@pom'
}

this exception is raised

Caused by: java.util.zip.ZipException: error in opening zip file
at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest(SignJarsTask.groovy:53)
at de.gliderpilot.gradle.jnlp.SignJarsTask$_signJars_closure3_closure7.doCall(SignJarsTask.groovy:40)
at groovyx.gpars.pa.GParsPoolUtilHelper$_eachParallelPA_closure8.doCall(GParsPoolUtilHelper.groovy:192)
... 10 more

Allow specifying arbitrary <property>s under <resources>

(Apologies if this is already possible; if it is, I couldn't figure it out.)

It would be useful to be able to specify additional <property name="foo" value="bar"/> elements for the <resources> block. For instance in an app I am working on porting to Gradle we specify

<property name="javaws.cfg.jauthenticator" value="true" />

to work around an overzealous HTTP authentication dialog that javaws offers by default (for historical reasons, settings this to true turns it off ๐Ÿ™„).

Currently it seems there is no way to add to the <resources> block automatically written by the plugin; specifying another resources in withXml results in a second <resources> block.

Global caching of signed artifacts

If an application has many dependencies, that do not change often, a huge amount of time on each clean build is wasted signing the same artifacts again and again with the same parameters.

There should be an option to cache already signed artifacts. This may be using a maven/ivy repository. This is somewhat related to #22, in that the cached artifact has the same constraints.

jardiff does not always work with pack200

Somehow some jardiffs do not work with pack200. There seems for example to be an issue with xalan:xalan when upgrading from 2.7.1 to 2.7.2. The diff.jar.pack.gz is created by the plugin, but webstart is not able to upgrade the application. In fact, the generated diff.jar.pack.gz can be unpacked with unpack200, but not be packed again using pack200:

Exception in thread "main" java.lang.SecurityException: SHA-256 digest error for org/apache/xalan/xsltc/trax/XSLTCSource.class
    at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:218)
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:241)
    at java.util.jar.JarVerifier.update(JarVerifier.java:228)
    at java.util.jar.JarVerifier$VerifierStream.read(JarVerifier.java:482)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
    at java.io.FilterInputStream.read(FilterInputStream.java:83)
    at com.sun.java.util.jar.pack.ClassReader$1.read(ClassReader.java:74)
    at java.io.DataInputStream.readInt(DataInputStream.java:387)
    at com.sun.java.util.jar.pack.ClassReader.readMagicNumbers(ClassReader.java:192)
    at com.sun.java.util.jar.pack.ClassReader.read(ClassReader.java:174)
    at com.sun.java.util.jar.pack.PackerImpl$DoPack.readClass(PackerImpl.java:511)
    at com.sun.java.util.jar.pack.PackerImpl$DoPack.run(PackerImpl.java:485)
    at com.sun.java.util.jar.pack.PackerImpl.pack(PackerImpl.java:100)
    at com.sun.java.util.jar.pack.Driver.main(Driver.java:313)

The JarDiffTask should check this.

Respect $JAVA_HOME when calling pack200

When pack200 is not inside the $PATH, the task fails:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':[censored]:signJars'.
> A problem occurred starting process 'command 'pack200''

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

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':[censored]:signJars'.
    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: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:208)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:186)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:62)
    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:111)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
    at org.gradle.initialization.DefaultGradleLauncher$6.run(DefaultGradleLauncher.java:174)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:47)
    at org.gradle.initialization.DefaultGradleLauncher.runBuildOperation(DefaultGradleLauncher.java:189)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:171)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:35)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:104)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:97)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.runRootBuildOperation(DefaultGradleLauncher.java:184)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:97)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:93)
    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:27)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:72)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:44)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49)
    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:37)
    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.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    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:71)
    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.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    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:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'pack200''
    at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:197)
    at org.gradle.process.internal.DefaultExecHandle.failed(DefaultExecHandle.java:326)
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:86)
    ... 2 more
Caused by: net.rubygrapefruit.platform.NativeException: Could not start 'pack200'
    at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:27)
    at net.rubygrapefruit.platform.internal.WrapperProcessLauncher.start(WrapperProcessLauncher.java:36)
    at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:68)
    ... 2 more
Caused by: java.io.IOException: Cannot run program "pack200" (in directory "/home/....[censored]"): error=2, Datei oder Verzeichnis nicht gefunden
    at net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25)
    ... 4 more
Caused by: java.io.IOException: error=2, Datei oder Verzeichnis nicht gefunden
    ... 5 more

Of course, most JDK executables are usually not part of the $PATH, so I think you should respect the enviroment variable $JAVA_HOME when calling pack200:

commandLine "pack200", "--repack", jarToSign

SignJars fails with Java 8u144

I am encountering a problem running the SignJars task. The exception thrown (below) is consistent with an issue that was introduced in 8u141 but supposedly fixed in 8u144; nevertheless I am unable to sign a particular JAR (org.eclipse.jgit:org.eclipse.jgit:4.8.0.201706111038-r) on my project, and it seems the same issue is causing your unit tests to fail when running ./gradlew test:

Caused by: java.lang.SecurityException: digest missing for org/jdesktop/jxlayer/JXLayer$1.class
	at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest_closure7_closure13(SignJarsTask.groovy:110)
	at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest_closure7(SignJarsTask.groovy:95)
	at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest(SignJarsTask.groovy:93)
	at de.gliderpilot.gradle.jnlp.SignJarsTask.signJars_closure3_closure9(SignJarsTask.groovy:49)
	at groovyx.gpars.pa.GParsPoolUtilHelper.eachParallelPA_closure8(GParsPoolUtilHelper.groovy:192)
	at groovyx.gpars.extra166y.AbstractParallelAnyArray$OUPap.leafApply(AbstractParallelAnyArray.java:640)
	at groovyx.gpars.extra166y.PAS$FJOApply.atLeaf(PAS.java:147)
	at groovyx.gpars.extra166y.PAS$FJBase.internalCompute(PAS.java:118)
	at groovyx.gpars.extra166y.PAS$FJBase.compute(PAS.java:106)
	at jsr166y.RecursiveAction.exec(RecursiveAction.java:148)
	at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:305)
	at jsr166y.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:575)
	at jsr166y.ForkJoinPool.scan(ForkJoinPool.java:755)
	at jsr166y.ForkJoinPool.work(ForkJoinPool.java:617)
	at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:369)

I'm a bit at a loss as to how to deal with this other than sticking with 8u121.

Provide some basic documentation of jnlp-war plugins and your JnlpDownloadServlet

Thanks for the great jnlp plugin!

By making a search on https://plugins.gradle.org/, I discovered you also provide a jnlp-war plugin. Looking at the source code, I think I understand it's meant to provide support for multiple versions of JNLP files and JARDiff patches and also adds your own version of JnlpDownloadServlet to the project runtime dependencies.

I could not find any example on how to use the whole thing in the examples directory (forgive me if I'm wrong). Also, it's not evident to me what your JnlpDownloadServlet offers compared to the one provided by the standard JDK sample package.

resources/jar attribute download

I know this version can't do, but I need to specify the download attribute.

e.g.: <jar href="lib/foo.Jar" download="eager" version="1.2"/>

There is a way that you implement this?

Problem when used together with io.spring.dependency-management plugin

I've got a problem when using the plugin io.spring.dependency-management together with the gradle-jnlp-plugin version 0.0.6 (and newest also) in a multi-module-project with Gradle 2.13:

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration 'detachedConfiguration9'.
> Module version acme:some-module:1.0-SNAPSHOT, configuration 'detachedConfiguration9' declares a dependency on configuration 'default' which is not declared in the module descriptor for acme:some-module:1.0-SNAPSHOT

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

* Exception is:
org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration 'detachedConfiguration9'.
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:70)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolve(ErrorHandlingConfigurationResolver.java:45)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:371)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:346)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$700(DefaultConfiguration.java:59)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.getResolutionResult(DefaultConfiguration.java:773)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.findExcludedDependencies(ExclusionConfiguringAction.groovy:97)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.applyMavenExclusions(ExclusionConfiguringAction.groovy:77)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.this$2$applyMavenExclusions(ExclusionConfiguringAction.groovy)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.execute(ExclusionConfiguringAction.groovy:72)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.execute(ExclusionConfiguringAction.groovy)
> Configat org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy22.beforeResolve(Unknown Source)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:388)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:369)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:346)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getBuildDependencies(DefaultConfiguration.java:414)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getBuildDependencies(Unknown Source)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:92)
    at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:202)
    at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:112)
    at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:64)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.doResolve(CachingTaskDependencyResolveContext.java:76)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.resolve(CachingTaskDependencyResolveContext.java:65)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:55)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.addToTaskGraph(DefaultTaskExecutionPlan.java:139)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.addTasks(DefaultTaskGraphExecuter.java:98)
    at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:47)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
    at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
    at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36)
    at org.gradle.initialization.DefaultGradleLauncher$3.run(DefaultGradleLauncher.java:143)
    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:140)
    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.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    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:37)
    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.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    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.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    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:246)
    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.RuntimeException: Module version acme:some-module:1.0-SNAPSHOT, configuration 'detachedConfiguration9' declares a dependency on configuration 'default' which is not declared in the module descriptor for acme:some-module:1.0-SNAPSHOT
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyToConfigurationResolver.collectTargetConfiguration(DefaultDependencyToConfigurationResolver.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyToConfigurationResolver.resolveTargetConfigurations(DefaultDependencyToConfigurationResolver.java:36)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphBuilder.java:262)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBuilder.java:230)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:137)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver$1.execute(DefaultArtifactDependencyResolver.java:88)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver$1.execute(DefaultArtifactDependencyResolver.java:78)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:78)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:41)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
    at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolve(DefaultConfigurationResolver.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyConfigurationResolver.resolve(SelfResolvingDependencyConfigurationResolver.java:40)
    at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolve(ShortCircuitEmptyConfigurationResolver.java:52)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolve(ErrorHandlingConfigurationResolver.java:43)
    ... 88 more

Output from dependencies task:

:some-module:dependencies

------------------------------------------------------------
Project :some-module - Acme Some webstart
------------------------------------------------------------

archives - Configuration for archive artifacts.
No dependencies

compile - Dependencies for source set 'main'.
No dependencies

compileClasspath - Compile classpath for source set 'main'.
No dependencies

compileOnly - Compile dependencies for source set 'main'.
No dependencies

default - Configuration for default artifacts.
No dependencies

jnlp
:some-module:dependencies FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':some-module:dependencies'.
> Could not resolve all dependencies for configuration 'detachedConfiguration21'.
   > Module version acme:some-module:1.0-SNAPSHOT, configuration 'detachedConfiguration21' declares a dependency on configuration 'default' which is not declared in the module descriptor for acme:some-module:1.0-SNAPSHOT

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

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':some-module:dependencies'.
    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)
> Buildiat 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.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    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:37)
    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.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
    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.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    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:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration 'detachedConfiguration21'.
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.wrapException(ErrorHandlingConfigurationResolver.java:70)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolve(ErrorHandlingConfigurationResolver.java:45)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:371)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:346)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$700(DefaultConfiguration.java:59)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.getResolutionResult(DefaultConfiguration.java:773)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.findExcludedDependencies(ExclusionConfiguringAction.groovy:97)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.applyMavenExclusions(ExclusionConfiguringAction.groovy:77)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.this$2$applyMavenExclusions(ExclusionConfiguringAction.groovy)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.execute(ExclusionConfiguringAction.groovy:72)
    at io.spring.gradle.dependencymanagement.exclusions.ExclusionConfiguringAction.execute(ExclusionConfiguringAction.groovy)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:93)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:82)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:44)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:79)
    at org.gradle.internal.event.BroadcastDispatch.dispatch(BroadcastDispatch.java:30)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy22.beforeResolve(Unknown Source)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:388)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:369)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:346)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$700(DefaultConfiguration.java:59)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.getResolutionResult(DefaultConfiguration.java:773)
    at org.gradle.api.tasks.diagnostics.internal.dependencies.AsciiDependencyReportRenderer.render(AsciiDependencyReportRenderer.java:85)
    at org.gradle.api.tasks.diagnostics.AbstractDependencyReportTask.generate(AbstractDependencyReportTask.java:60)
    at org.gradle.api.tasks.diagnostics.AbstractReportTask$2.generateReport(AbstractReportTask.java:72)
    at org.gradle.api.tasks.diagnostics.internal.ReportGenerator.generateReport(ReportGenerator.java:58)
    at org.gradle.api.tasks.diagnostics.AbstractReportTask.generate(AbstractReportTask.java:78)
    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)
    ... 68 more
Caused by: java.lang.RuntimeException: Module version acme:some-module:1.0-SNAPSHOT, configuration 'detachedConfiguration21' declares a dependency on configuration 'default' which is not declared in the module descriptor for acme:some-module:1.0-SNAPSHOT
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyToConfigurationResolver.collectTargetConfiguration(DefaultDependencyToConfigurationResolver.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyToConfigurationResolver.resolveTargetConfigurations(DefaultDependencyToConfigurationResolver.java:36)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphBuilder.java:262)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBuilder.java:230)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:137)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver$1.execute(DefaultArtifactDependencyResolver.java:88)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver$1.execute(DefaultArtifactDependencyResolver.java:78)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:78)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:41)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
    at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolve(DefaultConfigurationResolver.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyConfigurationResolver.resolve(SelfResolvingDependencyConfigurationResolver.java:40)
    at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolve(ShortCircuitEmptyConfigurationResolver.java:52)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolve(ErrorHandlingConfigurationResolver.java:43)
    ... 102 more


BUILD FAILED

Desktop shortcut tag in the generated jnlp

Is it possible to have the following structure in the JNLP generated by this plugin :
...

<information>
    <title>My App</title>
    <vendor>My Company</vendor>
    <homepage href="http://example.com"/>
    <description>My Description</description>
    <description kind="short">desc short</description>
    <icon href="splash.png" kind="splash"/>
    <icon kind="shortcut" href="icon.png" />
    <shortcut online="false" install="true">  
        <desktop/>  
        <menu submenu="My APP"/>  
    </shortcut> 
</information>

...
Basically, the <shortcut> tag is what I need for deploying a desktop shortcut of my app on the client machine.
Can someone please help me on this ?

version missed

May I ask to add the next code:


diff --git a/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPluginExtension.groovy b/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPluginExtension.groovy
index b4886ef..85ab6b0 100644
--- a/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPluginExtension.groovy
+++ b/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPluginExtension.groovy
@@ -36,8 +36,6 @@
     // not needed, if application-plugin is applied
     String mainClassName
 
-
-
     Map jnlpParams = [spec: '7.0', href: 'launch.jnlp']
     Map j2seParams
 
@@ -92,6 +90,10 @@ void spec(String spec) {
         jnlpParams.spec = spec
     }
 
+    void version(String version) {
+        jnlpParams.version = version
+    }
+
     void withXml(Closure closure) {
         withXmlClosure = closure
     }

JnlpTask keeps file handles open

After running the generateJnlp task with enabled gradle daemon, the gradle daemon keeps file handles to the generated jnlp file and the jars open.

Support use of plugin with JDK6

issue36-jdk6-support.patch.txt

Currently the plugin is compiled with target version 1.7 which prevents it from being used in projects that are constrained to use JDK6. Since JNLP is usually used by older Java projects there is a need to support projects built and run on JDK6.

Would it be possible to have the target version be 1.6 to allow broader use. I have attached a patch to address this need and would be grateful for your consideration to include it in next build of this awesome plugin. Thanks in advance.

Don't append alias to signed jar?

Is there a way to not append the alias to the signed jar??

jnlp {
    useVersions = false
    ...
}

Still puts the alias at the end of the signed jar. Is there a point to append it even?

Tasks not showing in command line mode?

When running your plugin in Eclipse, i could see the tasks under the Gradle Tasks panel under "other", however when I try to run it on other operating system such as RHEL5, when doing ./gradlew tasks, none of the tasks would show up, unless I manually do --all.

Is there a reason why it doesn't show up by default? Or perhaps, can you make it so that it sits in its own category? Perhaps have them go under "JNLP"?

signJars fails withZipException: duplicate entry: com/foo/ejb-jar.xml

I have a very complex legacy project that is being converted to use the gradle-jnlp-plugin. I have two sibling sub-projects that are both very similar. However, obe project builds fine and the other fails with log and stack trace below.

One observation is that even though the two projects have very similar dependencies the project that works creates many dependency jars to sign while the project that does not work seem to only be attempting to sign two jars.

Any suggestions what I should look for? I have looked for duplicate entries in relevant jars but am not seeing it. Is there a way to avoid this?

21:14:27.901 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
21:14:27.901 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
21:14:27.901 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
21:14:27.901 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':gem-5000-ui:signJars'.
21:14:27.901 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > java.lang.reflect.UndeclaredThrowableException (no error message)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Exception is:
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':gem-5000-ui:signJars'.
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
21:14:27.902 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:40)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:75)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
21:14:27.903 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.util.Swapper.swap(Swapper.java:38)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: java.lang.reflect.UndeclaredThrowableException
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinTask.getThrowableException(ForkJoinTask.java:504)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinTask.reportResult(ForkJoinTask.java:567)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinTask.join(ForkJoinTask.java:611)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinPool.invoke(ForkJoinPool.java:1492)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.extra166y.ParallelArrayWithMapping.apply(ParallelArrayWithMapping.java:48)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.extra166y.ParallelArray.apply(ParallelArray.java:329)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.pa.GParsPoolUtilHelper.eachParallelPA(GParsPoolUtilHelper.groovy:192)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPoolUtil.eachParallel(GParsPoolUtil.java:358)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask$_signJars_closure3.doCall(SignJarsTask.groovy:44)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy:174)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool.withExistingPool(GParsPool.groovy:173)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool$withExistingPool$1.callStatic(Unknown Source)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:145)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool$withPool$0.callStatic(Unknown Source)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:121)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.GParsPool$withPool.call(Unknown Source)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask.signJars(SignJarsTask.groovy:43)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	... 78 more
21:14:27.904 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: java.lang.reflect.UndeclaredThrowableException
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at com.sun.proxy.$Proxy79.op(Unknown Source)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.extra166y.AbstractParallelAnyArray$OUPap.leafApply(AbstractParallelAnyArray.java:640)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.extra166y.PAS$FJOApply.atLeaf(PAS.java:147)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.extra166y.PAS$FJBase.compute(PAS.java:108)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.RecursiveAction.exec(RecursiveAction.java:148)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:305)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:575)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinPool.scan(ForkJoinPool.java:755)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinPool.work(ForkJoinPool.java:617)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:369)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: java.util.zip.ZipException: duplicate entry: com/ilrd/gem/g5k/dm/ejb-jar.xml
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at java_util_jar_JarOutputStream$putNextEntry.call(Unknown Source)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask$_copyUnsignAndAlterManifest_closure7_closure13.doCall(SignJarsTask.groovy:91)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask$_copyUnsignAndAlterManifest_closure7.doCall(SignJarsTask.groovy:89)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask.copyUnsignAndAlterManifest(SignJarsTask.groovy:88)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at de.gliderpilot.gradle.jnlp.SignJarsTask$_signJars_closure3_closure9.doCall(SignJarsTask.groovy:45)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	at groovyx.gpars.pa.GParsPoolUtilHelper$_eachParallelPA_closure8.doCall(GParsPoolUtilHelper.groovy:192)
21:14:27.905 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 	... 10 more

Explain how the jnlp plugin is meant to be used in a war project

In my own Gradle multiproject, I ended up with this project structure:

  • master project
  • ria project
  • war project

The ria project applies the application and jnlp plugins, defines all the configuration needed to generate the JNLP file and the signed JARs.
The war project applies the war project and simply decorates the war task:

def createWebstartDirTask = project(':ria').createWebstartDir
war {
	into('my-ria-web-folder') {
		from createWebstartDirTask
	}
}

(please note, in my actual project I also add a similar decoration to eclipseWtpComponent to include the packed ria application in Eclipse WTP project files, too, but it's not relevant to this reporting).

However, in your versionBasedAndPack200EnabledMinimalWebstart example you suggest you may apply the JNLP plugin directly to the war project. Correct me if I'm wrong, but I understand you may specify the JNLP dependencies through the newly defined jnlp configuration (while in a project that applies the application plugin dependencies are taken directly from the runtime configuration). However, since the jnlp plugin automatically makes the jnlp configuration extend runtime, you have to include this:

configurations {
    jnlp {
        extendsFrom = []
    }
}

This path would allow to pack a RIA which is not defined in the same Gradle multiproject (the dependency added to the jnlp configuration may indeed be a standard external dependency) and move the problem to generate the JNLP and signed JARs to the war project (enabling different packaging of the same RIA application on different web applications). However, I encountered another problem. Event if you redefine the jnlp configuration to extend from "nothing" ([]), which in any case sounds like a not-so-elegant requirement, looking at the source code I also see that the whole project the jnlp plugin is applied to is added to the jnlp dependencies (see: https://github.com/tschulte/gradle-jnlp-plugin/blob/develop/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPlugin.groovy#L52). This means that the whole war project classpath is added to the jnlp configuration (through transitive dependencies), which does not sound correct to me and makes me wonder whether making the jnlp configuration extend the runtime configuration is indeed needed or not.

IMHO, the whole block at https://github.com/tschulte/gradle-jnlp-plugin/blob/develop/gradle-jnlp-plugin/src/main/groovy/de/gliderpilot/gradle/jnlp/GradleJnlpPlugin.groovy#L48 should be applied only if the project does not also apply the war plugin.

What do you think?

Switch Release build to new gradle-semantic-release-plugin

Currently this project is using the axion-release plugin. This is nice, as it does infer the version from the existing tags of the repository. But currently new releases are done on my development machine.

After release, I have to write the releasenotes manually and upload it manually to github.

I want to switch to the gradle-semantic-release-plugin, to automate all these tasks:

  • Commit using the AngularJs commit message conventions
  • Push
  • Travis does the release, including the releasenotes
  • Done

Downgrade does not work without javaws -uninstall

The Servlet currently does use the last modified time of the generated jnlp file. This is OK, as long as the new version is always going up in time. But if for some reason the deployed version is older (e.g. due to a downgrade because of a bug), the server will answer the request of javaws containing the HTTP-Header "If-Modified-Since" with a HTTP 304 Not-Modified. Thus javaws will still start the old (newer, but buggy) version.

The Servlet should use an etag instead of Last-Modified for non-version-based downloads.

how to add property in the resources tag

Hi,
I need to add a property to the resources tag in the jnlp
I try to use
jnlp.withXml.resources {
property('name' : 'browser', 'value' : '6.00.2800') {}
}

but in the file I find 2 resources tag.

thanks.

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.