Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support use of plugin with JDK6 #36

Closed
farrukhnajmi opened this issue Dec 20, 2016 · 13 comments
Closed

Support use of plugin with JDK6 #36

farrukhnajmi opened this issue Dec 20, 2016 · 13 comments

Comments

@farrukhnajmi
Copy link

farrukhnajmi commented Dec 20, 2016

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.

tschulte added a commit that referenced this issue Dec 22, 2016
compile using source and target 1.6 instead of 1.7

Closes #36
tschulte added a commit that referenced this issue Dec 22, 2016
compile using source and target 1.6 instead of 1.7

Closes #36
@tschulte
Copy link
Owner

Yes, in principle it is possible to use JDK 6 and also to compile the plugin with target 1.6.

But the plugin by default generates JNLP files that use some features of Webstart that require Java 7. These are used to enable deploying the generated folder with JLNP file and jar files directly to any HTTP server.

To use Java 6 you must use the servlet and cannot just deploy to a normal HTTP server. The jnlp war plugin removes these Java 7 features from the JNLP file again and generates a War file that should be deployable using Java 6 only. But the servlet container must support servlet 3.0.

@farrukhnajmi
Copy link
Author

You are my hero! Thank you :-) How can I test out a pre-release version of your commit and when do you think we will see this feature in a released version?

@tschulte
Copy link
Owner

The release yesterday did not work due to an OutOfMemoryError on travis. I retriggered the job and now the version 1.1.0 is released. Please check.

@farrukhnajmi
Copy link
Author

Thank you very much! I tried doing a build with JDK 6 after wiping out my gradle cache for good measure and I get an error. Did you by chance do the build with JDK 7? Please let me know when you wish me to try another version.

* What went wrong:
A problem occurred evaluating root project 'gem'.
> java.lang.UnsupportedClassVersionError: com/netflix/gradle/plugins/packaging/SystemPackagingPlugin : Unsupported major.minor version 51.0

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

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project 'gem'.
        at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:93)
        at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$2.run(DefaultScriptPluginFactory.java:177)
        at org.gradle.configuration.ProjectScriptTarget.addConfiguration(ProjectScriptTarget.java:77)
        at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:182)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:38)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:25)
        at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
        at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:540)
        at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:93)
        at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:42)
        at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)
        at org.gradle.initialization.DefaultGradleLauncher$2.run(DefaultGradleLauncher.java:124)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:53)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:121)
        at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:98)
        at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:92)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:63)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:92)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:83)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:99)
        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:48)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        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:237)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.UnsupportedClassVersionError: com/netflix/gradle/plugins/packaging/SystemPackagingPlugin : Unsupported major.minor version 51.0
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2199)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3934)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821)
        at org.gradle.api.internal.plugins.DefaultPluginRegistry.uncheckedGet(DefaultPluginRegistry.java:149)
        at org.gradle.api.internal.plugins.DefaultPluginRegistry.lookup(DefaultPluginRegistry.java:144)
        at org.gradle.api.internal.plugins.DefaultPluginRegistry.lookup(DefaultPluginRegistry.java:127)
        at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:108)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$5.run(DefaultPluginRequestApplicator.java:170)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:204)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:168)
        at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:157)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:38)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:25)
        at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
        at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:540)
        at org.gradle.api.internal.project.AbstractProject.evaluationDependsOn(AbstractProject.java:612)
        at org.gradle.api.internal.project.AbstractProject.evaluationDependsOnChildren(AbstractProject.java:595)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:374)
        at org.gradle.internal.metaobject.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:169)
        at org.gradle.internal.metaobject.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:96)
        at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.invokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
        at org.gradle.internal.metaobject.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:163)
        at org.gradle.groovy.scripts.BasicScript.methodMissing(BasicScript.java:79)
        at build_493tgmj710s4k8lvmhjlqvf68.run(/home/vagrant/CC_GEM_EVAL45_E40_MERGE_BMP/src/app/dm/gem/build.gradle:216)
        at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:91)
        ... 58 more
Caused by: java.lang.UnsupportedClassVersionError: com/netflix/gradle/plugins/packaging/SystemPackagingPlugin : Unsupported major.minor version 51.0
        at org.gradle.internal.classloader.MultiParentClassLoader.loadClass(MultiParentClassLoader.java:68)
        at org.gradle.internal.classloader.CachingClassLoader.loadClass(CachingClassLoader.java:43)
        at org.gradle.api.internal.plugins.DefaultPluginRegistry$1.load(DefaultPluginRegistry.java:71)
        at org.gradle.api.internal.plugins.DefaultPluginRegistry$1.load(DefaultPluginRegistry.java:51)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)

@tschulte
Copy link
Owner

I did the build with JDK 7, because Travis could not build with JDK 6:

$ jdk_switcher use oraclejdk6

Sun/Oracle JDK 6 is EOL since November 2012, and is no longer supported. Please consider upgrading...

The command "jdk_switcher use oraclejdk6" failed and exited with 1 during .

gradle-jnlp-plugin does not depend on any other plugin, only GPars and webstart-jnlp-servlet (for generating the JarDiff files). Your error seems to be during loading the gradle-ospackage-plugin, which is most probably applied in your build.gradle.

@farrukhnajmi
Copy link
Author

farrukhnajmi commented Jan 6, 2017

Happy new year Tobias. Thank you for your terrific response on this issue even during the holidays.

My work with this plugin is ready to commit but for this issue. I looked into Travis and it appears that just like Jenkins it allows a job to use whatever JDK its wants though the default is JDK 7. This can be overriden for a specific Travis job:

https://blog.travis-ci.com/support_for_multiple_jdks/
https://docs.travis-ci.com/user/languages/java/

"The Travis CI environment provides Oracle JDK 7 (default), Oracle JDK 8, OpenJDK 6, OpenJDK 7, Gradle 2.0, Maven 3.2 and Ant 1.8, and has sensible defaults for projects that use Gradle, Maven or Ant."

I would be very grateful if you could do a release with JDK 6 bytecode. I am available to help if you like in any way including if you wish to add me to the project.

Please let me know what to expect. If this cannot be done then my plan B is to build the plugin on my own with a private release version and publish to our internal Artifactory. I would very much prefer not to do this if possible. TIA.

@tschulte
Copy link
Owner

tschulte commented Jan 6, 2017

I hessitated to switch to openjdk6, because I am not sure if this might cause problems elsewhere. I just accidentally committed and pushed to master to use openjdk6 (wanted to use a feature branch). But it does not build, because Grgit, which I use for release, does not work with jdk6 (https://travis-ci.org/tschulte/gradle-jnlp-plugin/builds/189596436). I removed the commit again and force-pushed.

But as I already wrote, I am sure that this would not fix your issue anyway, because you seem to have an issue with another plugin.

@farrukhnajmi
Copy link
Author

farrukhnajmi commented Jan 9, 2017

Hi Tobias, I am not sure I have the necessary background to understand all the constraints preventing building and publishing a release of this plugin that will work with JDK 6. For example, I wonder, why could Grgit alone not use JDK 7 while all else use JDK 6?

In any event, my plan B is to build the plugin myself with JDK 6 and publish it in my private Artifactory repo. This is not ideal but it gets me unstuck. Can you please tell me the steps to do this? Currently when I build from cloned master it produces version 1.0.1-develop-SNAPSHOT. But the latest released version seems to be 1.0.2.

To summarize to build our own private version of the plugin and deploy to our private Artifactory I am looking for answers to the following:

  • Am I on the correct branch and using the latest bits before patching it with my changes? If so, why am I seeing 1.0.1-develop-SNAPSHOT instead of 1.0.3-develop-SNAPSHOT since released version is 1.0.2?
  • How can I customize the versionName to add some suffix to indicate that this is our private patch. Is it in ./gradle-jnlp-plugin/build/resources/main/META-INF/gradle-plugins/de.gliderpilot.jnlp-war.properties ?
  • How can I build the plugin. I assume it is "gradle assemble"
  • How can I deploy the plugin to private artifcatory. I assume we set Artifactory properties and run "gradle artifactoryPublish". When I do this I find that the build is published but no artifcats are published.

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

Here is the output of my git status command:

# On branch develop
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   .gitignore
#	modified:   examples/application/griffon-app/lifecycle/Initialize.java
#	modified:   gradle.properties
#	modified:   gradle/artifactory.gradle
#	modified:   gradle/compile.gradle
#	modified:   jnlp-servlet/src/main/java/de/gliderpilot/jnlp/servlet/JnlpRequestHandler.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	issue36-jdk6-support.patch.txt

@tschulte
Copy link
Owner

The default Branch in GitHub at the moment is develop, but the latest version is master.

Now that you have published your own version of the plugin to your artifactory, have you been able to build with java 6?

@farrukhnajmi
Copy link
Author

farrukhnajmi commented Jan 11, 2017

I realized there is no need to build with JDK 6. I built with JDK 8 and only specified sourceCompatibility and targetCompatibility to be 1.6 which is alreday in my patch as shown below:

-sourceCompatibility='1.7'
-targetCompatibility='1.7'
+sourceCompatibility='1.6'
+targetCompatibility='1.6'

THis guarentees that the byte code emitted is JDK 6 byte code and that is all to allow an app based on JDK 6 to be able to build with the excellent gradle-jnlp-plugin using JDK 6.

In summary, I think you can do the same in the actual project and generate plugin with JDK 6 bytecode.

Thoughts? If you agree then a release with all my patches for this and related issues would be awesome.

@tschulte
Copy link
Owner

Yes, and exactly that was done with https://github.com/tschulte/gradle-jnlp-plugin/releases/tag/v1.1.0 20 days ago. Or am I missing something?

@farrukhnajmi
Copy link
Author

farrukhnajmi commented Jan 11, 2017

Hmmm. I will test again but I thought that version was JDK 7 byte code meaning that the patch segment below was not applied:

-sourceCompatibility='1.7'
-targetCompatibility='1.7'
+sourceCompatibility='1.6'
+targetCompatibility='1.6' 

Let me retest and report back. Can you tell me what version to declare for the plugin to be sure? Judging from pom.xml it should be 1.1.0. Will test with that.

@farrukhnajmi
Copy link
Author

Hi Tobia, it seems that version 1.1.0 works just fine. I am not sure where I mistakenly thought we had an issue. My aopology for the time you spent looking into this due to my mistake. Thanks again for a terrific plugin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants