Using the google-java-format eclipse plugin works great when running Eclipse under Java 11, but when running on Java 16+, it fails with the following error:
Full error: A save participant caused problems. The save participant 'Code Clean Up' caused an exception: java.lang.IllegalAccessError: class com.google.googlejavaformat.java.JavaInput (in unnamed module #0x99c5646) cannot access class com.sun.tools.javac.parser.Tokens$TokenKind (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.parser to unnamed module #0x99c5646. See the error log for details.
The google-java-formatter does note that when running on JDK 16+, you need to set the --add-exports flag when running the formatter, due to JEP-396 (strong encapsulation of JDK Internals). What isn't clear is how to tell set --add-exports for Eclipse plugins.
Adding the following to eclipse.ini (or in my case SpringToolSuite4.ini) doesn't seem to help (not to mention it feels wrong since its not targetting that particular plugin). Is there a different way to approach/fix this?
-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-Xms256m
-Xmx2048m
--illegal-access=permit
--add-modules=ALL-SYSTEM
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
Just like xDeyan said above, your eclipse.ini file must have the following lines below the -vmargs line
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
This has been tested and works with JDK17
For anyone still having this issue running on JDK 17, just add = between the --add-exports like so:
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
Related
On a remote Windows 10 system sbt failes to start with a NoClassDefFoundError:
C:\WORKBENCH\BPF\my-project>sbt -Djavax.net.ssl.trustStoreType=WINDOWS-ROOT -Dsbt.boot.credentials="C:\WORKBENCH\BPF\my-project\credentials.txt" -Dsbt.boot.directory=C:\WORKBENCH\BPF\.sbt\boot -Dsbt.coursier.home=C:\WORKBENCH\BPF\coursier -v
# Executing command line:
"C:\Program Files (x86)\Java\jre1.8.0_321\bin\java.exe"
-Djavax.net.ssl.trustStore="C:\Program Files (x86)\Java\jre1.8.0_321\lib\security\cacerts"
-Djavax.net.ssl.trustStorePassword=changeit
-Xms1024m
-Xmx1024m
-Xss4M
-XX:ReservedCodeCacheSize=128m
-cp
"C:\Program Files (x86)\sbt\bin\sbt-launch.jar"
xsbt.boot.Boot
-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
-Dsbt.boot.credentials=C:\WORKBENCH\BPF\my-project\credentials.txt
-Dsbt.boot.directory=C:\WORKBENCH\BPF\.sbt\boot
-Dsbt.coursier.home=C:\WORKBENCH\BPF\coursier
java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to xsbti.FullReload
at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:59)
at sbt.xMain.run(Main.scala:46)
at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
at xsbt.boot.Launch$.run(Launch.scala:149)
at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
at xsbt.boot.Launch$.launch(Launch.scala:159)
at xsbt.boot.Launch$.apply(Launch.scala:44)
at xsbt.boot.Launch$.apply(Launch.scala:21)
at xsbt.boot.Boot$.runImpl(Boot.scala:78)
at xsbt.boot.Boot$.run(Boot.scala:73)
at xsbt.boot.Boot$.main(Boot.scala:21)
at xsbt.boot.Boot.main(Boot.scala)
[error] [launcher] error during sbt launcher: java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to xsbti.FullReload
Tried with different SBT versions (1.6.2, 1.5.8, 1.4.9) by changing project/build.properties): The Stack Trace differs depending on the version, but it is always a NoClassDefFoundError.
The SBT version specified in the project is successfully downloaded by the launcher.
I suspect local file permission problems as cause (e.g. due to security policies) therefore i moved the boot and the coursier cache directory. However, this did not bring the desired success.
Does anyone have an idea what the Problem could be?
(I did not do much findings about it.) In my case i could fix it by changing to appropriate java version. Initially i ran with java 18v mistakenly and then changing to java 11v it worked.
I don't have a real diagnosis or causal explanation, but I did solve a similar problem (identical error message, Linux) by clearing out the sbt cache (the .sbt folder within your user directory).
Am using Eclipse Neon 2 on macOS Sierra and Lombok 1.16.14.
When I ran the Lombok Installer, it could not find any of my Eclipse or IntelliJ IDEA installations.
So, I had to manually "Specify Location" by pointing to the following file (no other directory or file would enable the "Install" button to become clickable):
eclipse-standard-neon2/Eclipse.app/Contents/Eclipse/eclipse.ini
After, installing, it said that "Installation was completed" and inside the eclipse.ini file, it had the following line inserted for the last line ( I pasted the full contents of the eclipse.ini ):
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.401.v20161122-1740
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-javaagent:../Eclipse/lombok.jar
lombok.jar was also automatically placed inside the same directory as eclipse.ini:
eclipse-standard-neon2/Eclipse.app/Contents/Eclipse/
However, when I launch Eclipse Neon 2 and trying to use any of the Lombok annotations, its fails to recognize the library in its classpath, even if I declare package import explicitly.
Also, when I re-run the Lombok Installer (in order, to uninstall Lombok), it still can't find the previous Eclipse IDE that I had to manually specify from the previous install?
When I tried to run Eclipse from the command line using the following (it still didn't work and there were no errors listed in stdout):
eclipse-standard-neon2/Eclipse.app/Contents/MacOS$ ./eclipse -vmargs -javaagent:../Eclipse/lombok.jar
Here's the stdout from running it from stdout:
objc[52949]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/MacOS/libjli.dylib (0x100543480) and /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1005a54e0). One of the two will be used. Which one is undefined.
org.eclipse.m2e.logback.configuration: The org.eclipse.m2e.logback.configuration bundle was activated before the state location was initialized. Will retry after the state location is initialized.
Starting Groovy-Eclipse compiler resolver. Specified compiler level: unspecified
671 2.4.8.xx-201702132212-e46 = STARTING
672 2.3.11.xx-201702132212-e46 = STARTING
org.eclipse.m2e.logback.configuration: Logback config file: /Users/devuser/DevTools/Java/eclipse/eclipse-standard-neon2/workspace/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.7.0.20160603-1933.xml
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [bundleresource://462.fwk1881585646:1/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [bundleresource://462.fwk1881585646:2/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
org.eclipse.m2e.logback.configuration: Initializing logback
Has anyone run into this issue?
Guess, I am not going to have the privilege of using / learning Lombok anytime soon. :(
You can verify if Lombok is installed correctly by opening the Help 🢒 About Eclipse dialog from the menu. In the white area on the right, the bottom line should read: Lombok v1.16.14 "Candid Duck" is installed. https://projectlombok.org/
If it doesn't, please verify your eclipse.ini. Make sure that the line -javaagent:../Eclipse/lombok.jar is below -vmargs. You can try using a full path here, it might be resolved from the wrong location.
If the line is there, but the lombok line is not display in the dialog, try to start Eclipse from the command line, and see if you get error messages.
The next version of lombok should find this installation.
The reason why the uninstaller doesn't suggest the previously entered location is that the lombok installer doesn't try to remember anything. The upside is that directory moves don't interfere, and the lombok installer doesn't leave any traces on your computer.
Disclosure: I am a lombok developer.
I'm trying to get the Jenkins SBT plugin working, which involves referencing the launcher jar, rather than the full SBT install.
This results in "class not found errors", which I believe is because the manifest does not contain the appropriate classpath to allow the launcher to be run like this:
java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M -Dsbt.log.noformat=true -jar /path-to/sbt/sbt-launch.jar package
However, this is exactly how the manual installation instructions at http://www.scala-sbt.org/0.13/tutorial/Manual-Installation.html say it should run.
Have I missed something, or should I be filing a bug report (either with the jenkins SBT plugin team or with SBT)?
EDIT: On closer inspection, it's actually failing due to "java.io.EOFException: Unexpected end of ZLIB input stream". I'll investigate this further and update my own question, as I have seen a few other people run into this same problem with SBT.
Try:
java -Xms512M -Xmx1536M -Xss1M -XX:MaxPermSize=256M -Dsbt.log.noformat=true -jar /path-to/sbt/sbt-launch.jar
If you create own file use (bash script):
java -Xms512M -Xmx1536M -Xss1M -XX:MaxPermSize=256M -Dsbt.log.noformat=true -jar /path-to/sbt/sbt-launch.jar "$#"
Note:
-XX:+CMSClassUnloadingEnabled is only valid for CMS Garbage collector. If you use java 7+ you can remove it. For java 8 remove also -XX:MaxPermSize=256M
I'm using Eclipse Juno with the Java (Java build 1.7.0_05-b05 64bit) and Scala-IDE plugin
(Scala IDE for Eclipse 2.1.0.nightly-2_09-201207100348-f1d9c23 org.scala-ide.sdt.feature.feature.group scala-ide.org).
Below are my custom settings for Eclipse eclipse.ini:
-vmargs
-Dosgi.requiredJavaVersion=1.7
-Dhelp.lucene.tokenizer=standard
-Xss8m
-Xms256m
-Xmx1536m
-XX:PermSize=64m
-server
-Xverify:none
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:+DoEscapeAnalysis
-XX:+UseCompressedOops
Every-time I try to use code completion Eclipse throwing me 2 error windows:
The 'Code Recommenders Calls Proposals' proposal computer from
the 'org.eclipse.recommenders.completion.rcp.calls' plug-in did
not complete normally.
The extension has thrown a runtime exception.
and
The 'Code Recommenders Overrides Proposals' proposal computer from
the 'org.eclipse.recommenders.completion.rcp.overrides' plug-in did
not complete normally.
The extension has thrown a runtime exception.
My scala-ide log below shows:
[Xlint:cantFindType]
2012-07-10 15:37:29,404 ERROR [main] - System.err -
[org.eclipse.jdt.launching] error can't determine modifiers of missing type
org.eclipse.pde.internal.ui.wizards.imports.PluginImportHelper
when weaving type org.eclipse.jdt.launching.JavaRuntime
when weaving classes
when weaving
[Xlint:cantFindType]
Is there any way to fix this?
Thank you.
UPDATE 1:
After disabling code Recommenders I'm getting a different error in my Slaca-Ide log:
2012-07-10 16:10:24,342 ERROR [main] - System.err - [org.eclipse.jdt.debug.ui]
error can't determine modifiers of missing type
org.eclipse.pde.internal.ui.wizards.imports.PluginImportHelper
when weaving type org.eclipse.jdt.internal.debug.ui.actions.ToggleBreakpointAdapter
when weaving classes
when weaving
[Xlint:cantFindType]
but the scala code completion now works ok
Would you mind open a bug report on Code Recommenders including a stacktrace in order to fix this?
I just installed a Maven plug-in into eclipse the first time. Now there is a message on eclipse startup, that i should start eclipse in JDK not jre to make Maven components run fine. There is a -vm argument which I used in the eclipse.ini:
-vm C:\Program Files (x86)\Java\
But the message is still there after restart.
I've tried the:
C:\Program Files (x86)\Java\bin
and also the:
C:\Program Files (x86)\Java\bin\java.exe
But nothing changed.
How do I start eclipse in JDK?
Thanks in advance.
If you're using Windows, right click on your eclipse shortcut and select Properties, in the Shortcut tab you can change what's in the Target: box to specify the jdk. I use
"C:\Program Files\eclipse-jee-galileo-sr1 (3.5.1)\eclipse.exe" -vm "C:\Program Files\Java\jdk1.6.0_16\bin\javaw.exe" -vmargs -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
For some reason I couldn't get it to use the jdk when I tried editing the eclipse.ini file.
You can specify which JVM to launch Eclipse under in your eclipse.ini file. There are detailed instructions for different operating systems on the Eclipse wiki.
Found how to add it to the INI, must add the parameter to the line below the -vm option, as below:
-startup
plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-product
org.eclipse.epp.package.jee.product
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vm
C:\Program Files\Java\jdk1.6.0_17\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
You have many more options in the Equinox Launcher page.
And you have an example of a complete eclipse.ini with all options there.
When no -vm is specified, the launcher looks for a virtual machine first in a jre directory in the root of eclipse and then on the search path. If java is found in either location, then we look for a jvm shared library (jvm.dll on window, libjvm.so on *nix platforms) relative to that java executable.
If a jvm shared library is found we load it and use the JNI invocation api to start the vm.
If no jvm shared library is found, we exec the java launcher to start the vm in a new process.
-vm specified on command line or in eclipse.ini
Eclipse can be started with "-vm <location>" to indicate a virtual machine to use. There are several possibilities for the value of <location>:
java.exe/javaw.exe: <location> is a path to a java launcher. We exec that java launcher to start the vm in a new process.
jvm.dll or libjvm.so: <location> is a path to a jvm shared library. We attempt to load that library and use the JNI Invocation API to start the vm in the current process.
vmDesc.ee: <location> is a path to a file ending in ".ee". This file is expected to describe the execution environment for a jvm. See the Execution Environment Descriptions page.
directory: <location> is a directory. We look in that directory for:
(1) a default.ee file,
(2) a java launcher or
(3) the jvm shared library.
If we find the jvm shared library, we use JNI invocation.
If we find a launcher, we attempt to find a jvm library in known locations relative to the launcher.
If we find one, we use JNI invocation. If no jvm library is found, we exec java in a new process.