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

Add experimental support for Java 14 class files #897

Merged
merged 2 commits into from Jun 20, 2019
Merged

Add experimental support for Java 14 class files #897

merged 2 commits into from Jun 20, 2019

Conversation

Godin
Copy link
Member

@Godin Godin commented Jun 18, 2019

No description provided.

@Godin Godin added this to the 0.8.5 milestone Jun 18, 2019
@Godin Godin requested a review from marchof June 18, 2019 09:59
@Godin Godin self-assigned this Jun 18, 2019
@Godin Godin added this to Implementation in Current work items via automation Jun 18, 2019
@Godin
Copy link
Member Author

Godin commented Jun 18, 2019

Unlike how it was before thanks to #829, JaCoCo agent version 0.8.4 already successfully starts under Java 14 and can be used for earlier class file versions:

$ mkdir src

$ cat <<END > src/Example.java
class Example {
  public static void main(String[] args) {
    System.out.println("Hello, Java 14!");
  }
}
END

$ java -version
openjdk version "14-ea" 2020-03-17
OpenJDK Runtime Environment (build 14-ea+1-1)
OpenJDK 64-Bit Server VM (build 14-ea+1-1, mixed mode, sharing)

$ javac --release 13 src/Example.java -d classes

$ javap -v -p classes/Example.class | grep major
  major version: 57

$ java -javaagent:jacoco-0.8.4/lib/jacocoagent.jar=append=false -cp classes Example
Hello, Java 14!

$ java -jar jacoco-0.8.4/lib/jacococli.jar execinfo jacoco.exec
[INFO] Loading exec file jacoco.exec.
CLASS ID         HITS/PROBES   CLASS NAME
Session "Godins-iMac.lrc.sonarsource.com-44315859": Tue Jun 18 12:39:41 CEST 2019 - Tue Jun 18 12:39:41 CEST 2019
8ef792bffeab5d18    1 of   2   Example

Instrumentation of Java 14 class files requires this change:

$ javac --release 14 src/Example.java -d classes

$ javap -v -p classes/Example.class | grep major
  major version: 58

$ java -javaagent:jacoco-0.8.4/lib/jacocoagent.jar=append=false -cp classes Example
java.lang.instrument.IllegalClassFormatException: Error while instrumenting Example.
        at org.jacoco.agent.rt.internal_035b120.CoverageTransformer.transform(CoverageTransformer.java:93)
        at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
        at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:823)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:721)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:644)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:416)
        at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:760)
        at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:655)
Caused by: java.io.IOException: Error while instrumenting Example.
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrumentError(Instrumenter.java:158)
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrument(Instrumenter.java:108)
        at org.jacoco.agent.rt.internal_035b120.CoverageTransformer.transform(CoverageTransformer.java:91)
        ... 16 more
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 58
        at org.jacoco.agent.rt.internal_035b120.asm.ClassReader.<init>(ClassReader.java:195)
        at org.jacoco.agent.rt.internal_035b120.asm.ClassReader.<init>(ClassReader.java:176)
        at org.jacoco.agent.rt.internal_035b120.asm.ClassReader.<init>(ClassReader.java:162)
        at org.jacoco.agent.rt.internal_035b120.core.internal.instr.InstrSupport.classReaderFor(InstrSupport.java:279)
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrument(Instrumenter.java:74)
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrument(Instrumenter.java:106)
        ... 17 more
Hello, Java 14!

$ java -jar jacoco-0.8.4/lib/jacococli.jar execinfo jacoco.exec
[INFO] Loading exec file jacoco.exec.
CLASS ID         HITS/PROBES   CLASS NAME
Session "Godins-iMac.lrc.sonarsource.com-131a0b": Tue Jun 18 12:42:31 CEST 2019 - Tue Jun 18 12:42:31 CEST 2019

Here is end-to-end test after this change:

$ javac --release 14 src/Example.java -d classes

$ javap -v -p classes/Example.class | grep major
  major version: 58

$ java -javaagent:jacoco-0.8.5.201906181015/lib/jacocoagent.jar=append=false -cp classes Example
Hello, Java 14!

$ java -jar jacoco-0.8.5.201906181015/lib/jacococli.jar classinfo classes/Example.class
  INST   BRAN   LINE   METH   CXTY   ELEMENT
     7      0      3      2      2   class 0x1fe8c4cca7e8812a Example

$ java -jar jacoco-0.8.5.201906181015/lib/jacococli.jar instrument classes --dest instrumented
[INFO] 1 classes instrumented to /private/tmp/example/instrumented.

$ javap -v -p instrumented/Example.class | grep major
  major version: 58

$ java -cp instrumented:jacoco-0.8.5.201906181015/lib/jacocoagent.jar Example
Hello, Java 14!

$ java -jar jacoco-0.8.5.201906181015/lib/jacococli.jar execinfo jacoco.exec
[INFO] Loading exec file jacoco.exec.
CLASS ID         HITS/PROBES   CLASS NAME
Session "Godins-iMac.lrc.sonarsource.com-c4b4e5b": Tue Jun 18 12:17:52 CEST 2019 - Tue Jun 18 12:17:53 CEST 2019
1fe8c4cca7e8812a    1 of   2   Example
Session "Godins-iMac.lrc.sonarsource.com-6c28ab93": Tue Jun 18 12:18:56 CEST 2019 - Tue Jun 18 12:18:56 CEST 2019
1fe8c4cca7e8812a    1 of   2   Example

$ java -jar jacoco-0.8.5.201906181015/lib/jacococli.jar report jacoco.exec --classfiles classes
[INFO] Loading execution data file /private/tmp/example/jacoco.exec.
[INFO] Analyzing 1 classes.

@Godin
Copy link
Member Author

Godin commented Jun 20, 2019

@marchof can we merge this? 😉

@marchof marchof merged commit 6be6564 into master Jun 20, 2019
Current work items automation moved this from Implementation to Done Jun 20, 2019
@marchof marchof deleted the jdk14 branch June 20, 2019 20:56
@marchof
Copy link
Member

marchof commented Jun 20, 2019

@Godin Sure! Sorry, got stuck in my inbox...

@Godin
Copy link
Member Author

Godin commented Jun 20, 2019

@marchof wow, that was fast 😆

@jacoco jacoco locked as resolved and limited conversation to collaborators Oct 11, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
Development

Successfully merging this pull request may close these issues.

None yet

2 participants