nhatminhle / cofoja

Contracts for Java
GNU Lesser General Public License v3.0
151 stars 18 forks source link

Cofoja not working in java 1.8 #39

Closed nhatminhle closed 9 years ago

nhatminhle commented 9 years ago

From robertje...@gmail.com on July 27, 2013 09:18:43

What steps will reproduce the problem? 1. Normal usage of Cofoja What is the expected output? What do you see instead? Normal behavior instead I'm getting :

build: [mkdir] Created dir: C:\Users\jesse\git\cofoja\target.apt_generated [javac] C:\Users\jesse\git\cofoja\cofoja-build.xml:39: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds [javac] Compiling 4 source files to C:\Users\jesse\git\cofoja\target.apt_generated [javac] An annotation processor threw an uncaught exception. [javac] Consult the following stack trace for details. [javac] java.lang.NoClassDefFoundError: com/sun/tools/javac/main/OptionName [javac] at com.google.java.contract.core.apt.AnnotationProcessor.setupPaths(AnnotationProcessor.java:225) [javac] at com.google.java.contract.core.apt.AnnotationProcessor.init(AnnotationProcessor.java:148) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:503) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:600) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:693) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:94) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1020) [javac] at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1154) [javac] at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1146) [javac] at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:832) [javac] at com.sun.tools.javac.main.Main.compile(Main.java:517) [javac] at com.sun.tools.javac.main.Main.compile(Main.java:376) [javac] at com.sun.tools.javac.main.Main.compile(Main.java:365) [javac] at com.sun.tools.javac.main.Main.compile(Main.java:356) [javac] at com.sun.tools.javac.Main.compile(Main.java:77) [javac] at com.sun.tools.javac.Main.main(Main.java:62) [javac] Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.main.OptionName What version of the product are you using? On what operating system? I'm using cofoja-1.1-20130405.jar on windows 7 Please provide any additional information below. See https://groups.google.com/forum/#!topic/cofoja/3q8Ol5nVnOY for a workaround.

Original issue: http://code.google.com/p/cofoja/issues/detail?id=39

nhatminhle commented 9 years ago

From emmanuel...@gmail.com on April 09, 2014 23:46:18

Here is a guide to convert the old APT code to the new API: http://docs.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html

nhatminhle commented 9 years ago

From nhat.min...@gmail.com on April 10, 2014 01:20:47

Thanks, but Cofoja is already using the new APT API; it's just that there are some leftover optional uses of internal APIs that should maybe be removed at this point.

Status: Accepted

nhatminhle commented 9 years ago

From emmanuel...@gmail.com on April 15, 2014 02:09:42

The com.sun.tools.javac.main.OptionName class in Java 7 as been renamed to com.sun.tools.javac.main.Option in Java 8. I worked around this issue by replacing the enums with the equivalent String in com.google.java.contract.core.apt.AnnotationProcessor (i.e. OptionName.CP becomes "-cp").

However the build still fails with the following error:

stage0: [mkdir] Created dir: /home/ebourg/packaging/cofoja/obj/tmp0 [mkdir] Created dir: /home/ebourg/packaging/cofoja/obj/stage0 [ujavac] Compiling 85 source files to /home/ebourg/packaging/cofoja/obj/tmp0 [ujavac] warning: [options] bootstrap class path not set in conjunction with -source 1.7 [ujavac] Note: /home/ebourg/packaging/cofoja/src/com/google/java/contract/util/Predicates.java uses unchecked or unsafe operations. [ujavac] Note: Recompile with -Xlint:unchecked for details. [cofojab] Instrumenting 147 class files to /home/ebourg/packaging/cofoja/obj/stage0

BUILD FAILED /home/ebourg/packaging/cofoja/build.xml:180: The following error occurred while executing this line: /home/ebourg/packaging/cofoja/build.xml:107: java.lang.instrument.IllegalClassFormatException at com.google.java.contract.core.agent.ContractClassFileTransformer.transformWithDebug(ContractClassFileTransformer.java:319) at com.google.java.contract.core.agent.PreMain.instrument(PreMain.java:186) at PreAgentAntTask.execute(PreAgentAntTask.java:73) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:435) at org.apache.tools.ant.Target.performTasks(Target.java:456) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) at org.apache.tools.ant.Project.executeTarget(Project.java:1364) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1248) at org.apache.tools.ant.Main.runBuild(Main.java:851) at org.apache.tools.ant.Main.startAnt(Main.java:235) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) Caused by: java.lang.IllegalArgumentException at org.objectweb.asm.ClassReader.(Unknown Source) at org.objectweb.asm.ClassReader.(Unknown Source) at com.google.java.contract.core.agent.ContractClassFileTransformer.instrumentWithDebug(ContractClassFileTransformer.java:403) at com.google.java.contract.core.agent.ContractClassFileTransformer.transformWithDebug(ContractClassFileTransformer.java:316)

nhatminhle commented 9 years ago

From emmanuel...@gmail.com on April 15, 2014 02:30:52

Upgrading to asm 5.0.1 fixed this issue, but now there is a compilation error in buildtest2:

[ujavac] error: error in contract: name clash: g(T) in com.google.java.contract.tests.GenericsTest.J$com$google$java$contract$H and g(T) in com.google.java.contract.tests.GenericsTest.J have the same erasure, yet neither overrides the other [ujavac] /home/ebourg/packaging/cofoja/test/com/google/java/contract/tests/GenericsTest.java:98: error: error in contract: method com$google$java$contract$PH$com$google$java$contract$tests$GenericsTest$J$g in class com.google.java.contract.tests.GenericsTest.J$com$google$java$contract$H cannot be applied to given types; [ujavac] @Requires("x.toString().length() >= 2") [ujavac] ^ [ujavac] required: T,com.google.java.contract.tests.GenericsTest.J,com.google.java.contract.PreconditionError [ujavac] found: T,com.google.java.contract.tests.GenericsTest.J$com$google$java$contract$H,com.google.java.contract.PreconditionError [ujavac] reason: inference variable T has incompatible bounds [ujavac] equality constraints: com.google.java.contract.tests.GenericsTest.T [ujavac] lower bounds: T [ujavac] null [ujavac] /home/ebourg/packaging/cofoja/test/com/google/java/contract/tests/GenericsTest.java:99: error: error in contract: method com$google$java$contract$QH$com$google$java$contract$tests$GenericsTest$J$g in class com.google.java.contract.tests.GenericsTest.J$com$google$java$contract$H cannot be applied to given types; [ujavac] @Ensures("result >= 2") [ujavac] ^ [ujavac] required: T,com.google.java.contract.tests.GenericsTest.J,int [ujavac] found: T,com.google.java.contract.tests.GenericsTest.J$com$google$java$contract$H,int [ujavac] reason: inference variable T has incompatible bounds [ujavac] equality constraints: com.google.java.contract.tests.GenericsTest.T [ujavac] lower bounds: T [ujavac] null

nhatminhle commented 9 years ago

From nhat.min...@gmail.com on April 15, 2014 02:31:29

Have you tried running a more recent version of ASM (the underlying bytecode generation library)? There may be incompatibilities (but then again Cofoja may not work with a new ASM due to API changes).

I'll try to take a look when I have some time, but I'm a bit busy right now (and I'm not working with Java).

nhatminhle commented 9 years ago

From ig...@interlink-ua.com on May 09, 2014 10:40:52

Probably it's related to improved type inference in Java 8. If you rename class GenericsTest.T to something else, e.g. GenericsTest.TT, then it should compile the helper.

I've got the following "ant clean test" results with Cofoja r150 + ASM 5.0.2 + "patch to rename com.sun.tools.javac.main.OptionName to Option" + "patch of build.xml to support os specific file separator in classpath":

[...] test: [junit] Running com.google.java.contract.tests.ConstantContractsTest [junit] Tests run: 9, Failures: 0, Errors: 0, Time elapsed: 0.058 sec [junit] Running com.google.java.contract.tests.ConstructorTest [junit] Tests run: 9, Failures: 0, Errors: 1, Time elapsed: 0.058 sec

BUILD FAILED build.xml:240: Test com.google.java.contract.tests.ConstructorTest failed

nhatminhle commented 9 years ago

From ig...@interlink-ua.com on May 09, 2014 12:15:12

I've got all tests passed on win7 with ASM 5.0.2 and attached patches. Could you please give it a try on your side? I haven't tested it with real project yet.

Attachment: AnnotationProcessor.sun.pkg.change.patch build.xml.win.fix.patch ConstructorTest.win.fix.patch GenericsTest.java8.fix.patch

nhatminhle commented 9 years ago

From emmanuel...@gmail.com on June 04, 2014 07:21:58

Thank you very much for the patch, I confirm it works. I just replaced the OptionName constants with a string to remain compatible with Java 7 and Java 8.

nhatminhle commented 9 years ago

From nhat.min...@gmail.com on August 16, 2014 03:24:18

I've merged igoro@'s patches, except the sun package change. It breaks compatibility with previous JDKs and other people have been complaining about that "feature" so I am removing it entirely; just pass your classpath explicitly. I will probably be phasing out the last pieces that are Sun-internals-dependent soon, and replace them with more some explicit (but better-defined) alternatives.

Status: Fixed