Home » Modeling » TMF (Xtext) » Xtend Maven issues after upgrading to Java 9
Xtend Maven issues after upgrading to Java 9 [message #1830829] |
Wed, 05 August 2020 01:06  |
Mirko Raner Messages: 124 Registered: July 2009 Location: New York City, NY |
Senior Member |
|
|
I recently upgraded an Xtend project from Java 8 to Java 9, i.e. in the parent POM I replaced
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
with
<maven.compiler.release>9</maven.compiler.release>
This project previously built like a charm with Maven, but after upgrading to Java 9 I'm seeing a whole bunch of strange errors, both in the Xtend-to-Java compilation step, as well as during the translation of the generated Java code. I've tried coming up with a smaller project to demonstrate the issue, but this turned out to be non-straightforward, so I'm hoping maybe someone will recognize some of the problems I'm seeing and can point out what I'm missing.
The project is built on a CI system running Java 11 for a while; the problems were introduced when changing the target Java release from 8 to 9.
The project itself is not yet open-sourced, but there are a few self-contained source files that I can share, which hopefully shines a light on what's going here.
For example, consider the following Xtend class:
package fxxx.runtime
import fxxx.lang.Function
import java.lang.reflect.ParameterizedType
import java.util.NoSuchElementException
import java.util.stream.Stream
class Dispatcher<T>
{
Stream.Builder<Function<?, ?, T>> cases
new()
{
this(Stream.builder)
}
private new(Stream.Builder<Function<?, ?, T>> cases)
{
this.cases = cases
}
def Dispatcher<T> with(Function<?, ?, T> ^case)
{
new Dispatcher(cases.add(^case))
}
def T ^dispatch(Object dispatchObject)
{
cases.build
.filter[parameterType.isAssignableFrom(dispatchObject.class)]
.findFirst()
.map[(it as Function<?, Object, T>).apply(dispatchObject)]
.orElseThrow[new NoSuchElementException]
}
private def Class<?> parameterType(extension Function<?, ?, ?> function)
{
val ParameterizedType type = function.class.genericInterfaces.get(0) as ParameterizedType
type.actualTypeArguments.get(1) as Class<?>
}
}
After the Java 9 upgrade this class now fails with the following errors:
[ERROR] Failed to execute goal org.eclipse.tycho:tycho-compiler-plugin:1.7.0:compile (default-compile) on project fxxx.runtime: Compilation failure: Compilation failure:
[ERROR] /Users/mirko/git/fxxx/fxxx.runtime/xtend-gen/fxxx/runtime/Dispatcher.java:[89]
[ERROR] Type _get = function.getClass().getGenericInterfaces()[0];
[ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] Type mismatch: cannot convert from Type to Type
[ERROR] /Users/mirko/git/fxxx/fxxx.runtime/xtend-gen/faxx/runtime/Dispatcher.java:[92]
[ERROR] _xblockexpression = ((Class<?>) _get_1);
[ERROR] ^^^^^^^^^^^^^^^^^^^
[ERROR] Cannot cast from Type to Class<?>
[ERROR] 2 problems (2 errors)
The generated Java code, looks perfectly fine in Eclipse:
...
import java.lang.reflect.Type;
...
private Class<?> parameterType(@Extension final Function<?, ?, ?> function) {
Class<?> _xblockexpression = null;
{
Type _get = function.getClass().getGenericInterfaces()[0];
final ParameterizedType type = ((ParameterizedType) _get);
Type _get_1 = type.getActualTypeArguments()[1];
_xblockexpression = ((Class<?>) _get_1);
}
return _xblockexpression;
}
The only way to work around this issue is to set
<maven.compiler.release>8</maven.compiler.release>
for the affected sub-project.
Other sub-projects even fail already during the Xtend translation step, somehow the upgrade to Java 9 interfered with the handling of default methods:
package fxxx.generator
import java.util.function.Function
interface State<S, A> extends Function<S, Pair<S, A>>
{
def <B> State<S, B> map(Function<A, B> function)
{
val State<S, A> that = this
return
[
val Pair<S, A> value = that.apply(it)
value.key -> function.apply(value.value)
]
}
def <B> State<S, B> flatMap(Function<A, State<S, B>> function)
{
val State<S, A> that = this
return
[
val Pair<S, A> value = that.apply(it)
function.apply(value.value).apply(value.key)
]
}
}
The default methods now cause an error:
[INFO] --- xtend-maven-plugin:2.22.0:compile (default) @ fxxx ---
[ERROR]
ERROR: State.xtend - /Users/mirko/git/fxxx/fxxx/src/fxxx/generator/State.xtend
7: Abstract methods do not specify a body
[ERROR]
ERROR: State.xtend - /Users/mirko/git/fxxx/fxxx/src/fxxx/generator/State.xtend
17: Abstract methods do not specify a body
These two different issue are pretty representative of the other problems I'm seeing. Is there anything that I'm missing for upgrading an Xtend project to Java 9?
|
|
| |
Re: Xtend Maven issues after upgrading to Java 9 [message #1830986 is a reply to message #1830836] |
Fri, 07 August 2020 21:47   |
Mirko Raner Messages: 124 Registered: July 2009 Location: New York City, NY |
Senior Member |
|
|
Thanks for your prompt response, Christian! I had to put this task on the back burner for a couple of days, but I'm now back on it.
To be clear, the build system is running Java 11 but this code needs to compile and run on Java 9. Thanks to the link that you posted, I realized that whereas the Maven compiler plugin no longer needs the maven.compiler.source when maven.compiler.release is specified, the Xtend compiler plugin still is looking for maven.compiler.source. So, I adjusted the root POM to:
<properties>
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
<maven.compiler.release>9</maven.compiler.release>
...
This got me one sub-project farther, but then the next sub-project failed with similar issues. By running mvn -X I then realized that the plugin was not using javac, but the JDT compiler, and, among other things, it passed -properties .settings/org.eclipse.jdt.core.prefs to the compiler and also appeared to analyze OSGi manifests. It turned out that I had forgotten to change the Bundle-RequiredExecutionEnvironment in the manifests and that the settings files also still pointed to Java 8. So, I fixed all those issues as well, and now the next sub-project fails in a similar way:
[ERROR] Failed to execute goal org.eclipse.tycho:tycho-compiler-plugin:1.7.0:compile (default-compile) on project fxxx: Compilation failure: Compilation failure:
[ERROR] /Users/mirko/git/fxxx/fxxx/xtend-gen/fxxx/generator/TypeInferrer.java:[235]
[ERROR] boolean _isEmpty = functionalInterfaceMethod.isEmpty();
[ERROR] ^^^^^^^
[ERROR] The method isEmpty() is undefined for the type Optional<MethodDeclaration>
[ERROR] /Users/mirko/git/fxxx/fxxx/xtend-gen/fxxx/conversions/FxxxValueConverters.java:[31]
[ERROR] return string.replace("@", "");
[ERROR] ^^^^^^^
[ERROR] The method replace(char, char) in the type String is not applicable for the arguments (String, String)
I don't know exactly how Xtend and Tycho relate, but I wanted to point out that these errors are coming from the tycho-compiler-plugin, not from the Maven compiler plugin or from the Xtend Maven plugin.
The first error tells me that the compiler is not compiling against a Java 9 release profile: Optional.isEmpty() was introduced in Java 9 and should be readily available. The second error is even stranger: the String.replace(CharSequence, CharSequence) method was introduced in Java 5, so this suggests that the compiler is using a JDK 1.4 (or earlier?) profile.
The command line that Maven passes to the JDT compiler is a million miles long, but I do see
..., -target, 9, -source, 9, --release, 9, -encoding, UTF-8]
at the very end, which leads me to believe that all the options get passed along properly.
Other errors that I'm seeing are still along the line of the strange type mismatches I had seen earlier, e.g.:
[ERROR] /Users/mirko/git/fxxx/fxxx/xtend-gen/fxxx/generator/Translator.java:[1305]
[ERROR] final Method valueMethod = customizer.getClass().getDeclaredMethod(this._hardCodedNames.valueMethod());
[ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] Type mismatch: cannot convert from Method to Method
[ERROR] /Users/mirko/git/fxxx/fxxx/src-gen/fxxx/parser/antlr/FxxxAntlrTokenFileProvider.java:[13]
[ERROR] ClassLoader classLoader = getClass().getClassLoader();
[ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] Type mismatch: cannot convert from ClassLoader to ClassLoader
Another strange error seems to suggest that the compiler is aware of the Collectors class (introduced in Java 8), but does not seem to understand that String implements CharSequence:
[ERROR] /Users/mirko/git/fxxx/fxxx/xtend-gen/fxxx/utilities/TypePrinter.java:[73]
[ERROR] _xifexpression = types.stream().<String>map(_function).collect(Collectors.joining(", ", "<", ">"));
[ERROR] ^^^^^^^
[ERROR] The method joining(CharSequence, CharSequence, CharSequence) in the type Collectors is not applicable for the arguments (String, String, String)
What other things can I check to track down these strange problems?
|
|
| | | | | | | |
Re: Xtend Maven issues after upgrading to Java 9 [message #1831012 is a reply to message #1831008] |
Sun, 09 August 2020 02:51   |
Mirko Raner Messages: 124 Registered: July 2009 Location: New York City, NY |
Senior Member |
|
|
@christian, I finally managed to put up a reproducer on GitHub. I was unable to reproduce the String.replace problems, and the other problems related to CharSequence vs String. However, I was able to reproduce the "cannot convert from ClassLoader to ClassLoader" problem, as well as another strange problem that I'm not actually seeing in my original project:
mirko@Mirkos-MacBook-Pro Downloads % git clone https://github.com/raner/bugs.git
Cloning into 'bugs'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 31 (delta 5), reused 26 (delta 0), pack-reused 0
Unpacking objects: 100% (31/31), done.
mirko@Mirkos-MacBook-Pro Downloads % cd bugs
mirko@Mirkos-MacBook-Pro bugs % mvn clean install
[INFO] Scanning for projects...
[INFO] Computing target platform for MavenProject: top.java:bugs:1.0.0-SNAPSHOT @ /Users/mirko/Downloads/bugs/bugs/pom.xml
[INFO] Fetching p2.index from https://download.eclipse.org/releases/2020-06/
[INFO] Adding repository https://download.eclipse.org/releases/2020-06
[INFO] Fetching p2.index from https://download.eclipse.org/technology/epp/packages/2020-06/
[INFO] Fetching p2.index from https://download.eclipse.org/releases/2020-06/202006171000/
Aug 08, 2020 7:26:36 PM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (org.apache.http.NoHttpResponseException) caught when processing request to {s}->https://download.eclipse.org:443: The target server failed to respond
Aug 08, 2020 7:26:36 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {s}->https://download.eclipse.org:443
[INFO] Fetching p2.index from https://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.22.0/
[INFO] Adding repository https://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.22.0
[INFO] Resolving dependencies of MavenProject: top.java:bugs:1.0.0-SNAPSHOT @ /Users/mirko/Downloads/bugs/bugs/pom.xml
[INFO] Resolving class path of MavenProject: top.java:bugs:1.0.0-SNAPSHOT @ /Users/mirko/Downloads/bugs/bugs/pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] bugs-parent [pom]
[INFO] bugs [eclipse-plugin]
[INFO]
[INFO] ------------------------< top.java:bugs-parent >------------------------
[INFO] Building bugs-parent 1.0.0-SNAPSHOT [1/2]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ bugs-parent ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ bugs-parent ---
[INFO] Installing /Users/mirko/Downloads/bugs/pom.xml to /Users/mirko/.m2/repository/top/java/bugs-parent/1.0.0-SNAPSHOT/bugs-parent-1.0.0-SNAPSHOT.pom
[INFO]
[INFO] ---------------------------< top.java:bugs >----------------------------
[INFO] Building bugs 1.0.0-SNAPSHOT [2/2]
[INFO] ---------------------------[ eclipse-plugin ]---------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ bugs ---
[INFO]
[INFO] --- tycho-packaging-plugin:1.7.0:build-qualifier (default-build-qualifier) @ bugs ---
[INFO] The project's OSGi version is 1.0.0.202008090226
[INFO]
[INFO] --- tycho-packaging-plugin:1.7.0:validate-id (default-validate-id) @ bugs ---
[INFO]
[INFO] --- tycho-packaging-plugin:1.7.0:validate-version (default-validate-version) @ bugs ---
[INFO]
[INFO] --- xtend-maven-plugin:2.22.0:compile (default) @ bugs ---
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/Users/mirko/.m2/repository/com/google/inject/guice/3.0/guice-3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ bugs ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/mirko/Downloads/bugs/bugs/src/main/resources
[INFO]
[INFO] --- tycho-compiler-plugin:1.7.0:compile (default-compile) @ bugs ---
[INFO] Compiling 1 source file to /Users/mirko/Downloads/bugs/bugs/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for bugs-parent 1.0.0-SNAPSHOT:
[INFO]
[INFO] bugs-parent ........................................ SUCCESS [ 0.097 s]
[INFO] bugs ............................................... FAILURE [ 3.541 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.010 s
[INFO] Finished at: 2020-08-08T19:26:41-07:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.eclipse.tycho:tycho-compiler-plugin:1.7.0:compile (default-compile) on project bugs: Compilation failure: Compilation failure:
[ERROR] /Users/mirko/Downloads/bugs/bugs/xtend-gen/top/java/BrokenCode.java:[8]
[ERROR] return type.getClassLoader();
[ERROR] ^^^^
[ERROR] The type Class<capture#1-of ?> is not visible
[ERROR] /Users/mirko/Downloads/bugs/bugs/xtend-gen/top/java/BrokenCode.java:[14]
[ERROR] final ClassLoader classLoader = this.getClass().getClassLoader();
[ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ERROR] Type mismatch: cannot convert from ClassLoader to ClassLoader
[ERROR] 2 problems (2 errors)
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :bugs
mirko@Mirkos-MacBook-Pro bugs % java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02)
OpenJDK 64-Bit Server VM GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02, mixed mode, sharing)
mirko@Mirkos-MacBook-Pro bugs % mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 14.0.1, vendor: N/A, runtime: /usr/local/Cellar/openjdk/14.0.1/libexec/openjdk.jdk/Contents/Home
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.5", arch: "x86_64", family: "mac"
mirko@Mirkos-MacBook-Pro bugs %
Unbeknownst to me, my local Maven apparently brought its own installation of Java 14 along, but I don't think that's related to my problems.
|
|
|
Re: Xtend Maven issues after upgrading to Java 9 [message #1831015 is a reply to message #1831012] |
Sun, 09 August 2020 09:51   |
|
Problem also happens with no xtend involved at all.
(delete xtend file. replace it with generated java)
and also happens when calling the ECJ main (used by tycho) directly with java 14
package a;
public class Main {
public static void main(String[] args) {
org.eclipse.jdt.internal.compiler.batch.Main.main(new String[] { "-properties",
"/Users/cdietrich/eclipse-workspaces/jvmModelInferrer/bugs/bugs/.settings/org.eclipse.jdt.core.prefs",
"-s",
"/Users/cdietrich/eclipse-workspaces/jvmModelInferrer/bugs/bugs/target/generated-sources/annotations",
"-d", "/Users/cdietrich/eclipse-workspaces/jvmModelInferrer/bugs/bugs/target/classes", "-classpath",
"/Users/cdietrich/eclipse-workspaces/jvmModelInferrer/bugs/bugs/target/classes",
"/Users/cdietrich/eclipse-workspaces/jvmModelInferrer/bugs/bugs/src/top/java/BrokenCode.java", "-g",
"-nowarn", "-target", "11", "-source", "11", "--release", "11", "-encoding", "UTF-8" });
}
}
(also when called with Java 13)
when i leave out the
-release
it works fine.
thus i think we have a JDT bug here.
specifying <maven.compiler.release>11</maven.compiler.release>
only also does not work.
(here we also would have do adapt the xtend-maven-plugin to deal with this)
=> i assume the first thing would be to file a JDT bug
Need professional support for Xtext, Xpand, EMF?
Go to: https://www.itemis.com/en/it-services/methods-and-tools/xtext
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
| | |
Re: Xtend Maven issues after upgrading to Java 9 [message #1831023 is a reply to message #1831018] |
Mon, 10 August 2020 05:12   |
Mirko Raner Messages: 124 Registered: July 2009 Location: New York City, NY |
Senior Member |
|
|
Thanks, @christian and @lorenzo for the input on this! I also can confirm that it's apparently the --release option that causes the trouble. For my particular project, I was able to work around the issue by explicitly specifying an empty maven.compiler.release property while still keeping the .source and .target properties for Java 9:
<maven.compiler.source>9</maven.compiler.source>
<maven.compiler.target>9</maven.compiler.target>
<maven.compiler.release/>
I'm also no longer seeing issues during the Xtend-to-Java translation step, so I agree with Christian that this problem is actually unrelated to Xtend and most likely a JDT bug. I'll adjust my reproducer project to remove Xtend from the picture. So, in my mind, testing against a newer snapshot of Xtend won't make sense, but I'm wondering if there is an updated snapshot of the Tycho compiler plugin available.
@christian, regarding your earlier question as to why use Java 9 and not a newer version, that decision is pretty much driven by a desire to find the lowest common denominator. Many companies are moving slowly and often lag several Java versions behind. The project at hand requires some JVM features that are only available from Java 9 onward, so Java 9 was identified as the minimum requirement, though the code should also run on Java 11 or 14 without problems.
|
|
| | |
Goto Forum:
Current Time: Wed Jun 07 20:33:31 GMT 2023
Powered by FUDForum. Page generated in 0.02641 seconds
|