Compiler creates broken classfiles although errors are shown in output
Jan Lahoda
jan.lahoda at oracle.com
Thu Feb 18 10:39:35 UTC 2016
Hi Sven,
Thanks for the testcase - I can reproduce on JDK 8 now. I've augmented
the bug report with the testcase. Does not happen on JDK 9. I'll see
what should be done.
Thanks,
Jan
On 17.2.2016 22:06, Sven Reimers wrote:
> Ok so here is an example - copy and paste into a shell script, make
> javac available and run...
>
> See the script / output for details.
>
> Hope this helps
>
> Sven
>
> -------- snip here ---------
> #!/bin/bash
> mkdir interface
> cat <<EOF >interface/I.java
> public interface I {}
> EOF
>
> mkdir abstract
> cat <<EOF >abstract/AImpl.java
> public abstract class AImpl implements I {}
> EOF
>
> mkdir impl
> cat <<EOF >impl/Impl.java
> public class Impl extends AImpl {}
> EOF
>
> #Now create an AnnotationProcessor:
>
> mkdir processor
>
> cat <<EOF >processor/A.java
> import javax.annotation.processing.*;
> import java.util.Set;
> import javax.lang.model.element.TypeElement;
> import javax.lang.model.SourceVersion;
>
> @SupportedSourceVersion(SourceVersion.RELEASE_8)
> public class A extends AbstractProcessor {
>
> @Override
> public synchronized void init(ProcessingEnvironment env){
> System.out.println("Init");}
>
> @Override
> public boolean process(Set<? extends TypeElement> annoations,
> RoundEnvironment env) { System.out.println("process");return true; }
>
> }
> EOF
> mkdir processor/META-INF
> mkdir processor/META-INF/services
>
> cat <<EOF >processor/META-INF/services/javax.annotation.processing.Processor
> A
> EOF
> #Now compile all of them to different directories:
>
> mkdir build
>
> mkdir build/interface
> javac -d build/interface interface/I.java
>
> mkdir build/abstract
> javac -cp build/interface -d build/abstract abstract/AImpl.java
>
> mkdir build/processor
> javac -d build/processor processor/A.java
> cp -r processor/META-INF build/processor
>
> #Now try to compile Impl.java
>
> mkdir build/impl-v1
> echo Variant 1:
> echo javac -cp build/abstract -d build/impl-v1 impl/Impl.java
> javac -cp build/abstract -d build/impli-v1 impl/Impl.java
> echo $?
>
> #Fails due to missing interface class... exit code = 1
>
> mkdir build/impl-v2
> echo Variant 2
> echo javac -cp build/abstract -processorpath build/processor -d
> build/impl-v2 impl/Impl.java
> javac -cp build/abstract -processorpath build/processor -d build/impl-v2
> impl/Impl.java
> echo $?
> ls -la build/impl-v2/Impl.class
> #Does not fail due to missing interface class although output shows the
> problem... exit code = 0, class file generated but should not
>
> mkdir build/impl-v3
> echo Variant 3
> echo javac -cp build/abstract:build/interface -processorpath
> build/processor -d build/impl-v3 impl/Impl.java
> javac -cp build/abstract:build/interface -processorpath build/processor
> -d build/impl-v3 impl/Impl.java
> echo $?
> ls -la build/impl-v3/Impl.class
>
> #Succeeds and good class file
> -------- snip here ---------
> ---
>
> On Tue, Feb 16, 2016 at 3:08 PM, Sven Reimers <sven.reimers at gmail.com
> <mailto:sven.reimers at gmail.com>> wrote:
>
> Hi Jan,
>
> seems the problem is caused by using an annotation processor..
>
> It seems sufficient to have an annotation processor doing nothing to
> trigger the behaviour.
>
> Will try to post an example, if you need one..
>
> -Sven
>
> Am 15.02.2016 20:03 schrieb "Jan Lahoda" <jan.lahoda at oracle.com
> <mailto:jan.lahoda at oracle.com>>:
>
> Hi Sven,
>
> I tried the example with:
> $ javac -fullversion
> javac full version "1.8.0_40-b25"
>
> And it produced:
> $ javac Client.java
> Client.java:7: error: cannot access I
> new A().m();
> ^
> class file for p1.I not found
> 1 error
>
> No classfile was written.
>
> With:
> $ javac -fullversion
> javac full version "1.7.0_45-b35"
>
> $ javac Client.java
>
> produced no errors, and written a (correct as far as I can tell)
> classfile (equivalent to a classfile written when I.class is
> available).
>
> Do you have a testcase where javac produces an error, but writes
> an (incorrect) classfile?
>
> Thanks,
> Jan
>
> On 15.2.2016 17:02, Sven Reimers wrote:
>
> There is an example in here
>
> http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html
>
> Area: Tools / javac
>
> Synopsis
>
> Interfaces need to be present when compiling against their
> implementations
>
> Description
>
> When compiling a class against another class implementing an
> interface
> which is defined in yet another class file, such class file
> (where
> interface is defined) must be available in the class path used
> by javac during compilation. This is a new requirement as of
> JDK 8 - a
> failure to do so will result in a compilation error.
>
> Example:
>
> Client.java:
>
> import p1.A;
>
> class Client {
>
> void test() {
>
> new A.m();
>
> }
>
> }
>
> p1/A.java:
>
> package p1;
>
> public class A implements I {
>
> public void m() { }
>
> }
>
> p1/I.java:
>
> package p1;
>
> public interface I {
>
> void m();
>
> }
>
> If neither p1/I.java nor p1/I.class are available when compiling
> Client.java, the following error will be displayed:
>
> Client.java: error: cannot access I
>
> new A().m();
>
> ^
>
> class file for p1.I not found
>
>
> If this does not reproduce the problem, I will try to reduce
> our code sample
>
> Thanks
>
> Sven
>
>
> Hi Sven,
>
> Would you have a testcase on which this can be seen?
>
> Thanks,
> Jan
>
> On 15.2.2016 15:34, Sven Reimers wrote:
>
> >
> > Hi,
> >
> > I just ran
> intohttps://bugs.openjdk.java.net/browse/JDK-8145208
> <http://bugs.openjdk.java.net/browse/JDK-8145208>
> <https://bugs.openjdk.java.net/browse/JDK-8145208>
> >
> > The main problem is not to fix the error, but our
> continuous
> > integration is not creating breaking builds, so the
> error can get
> > unnoticed into builds and fails at runtime.
> >
> > Any idea if this can be fixed in an upcoming jdk 8u
> release?
> >
> > Any idea how to make the build break in this case?
> >
> > Thanks for your help
> >
> > -Sven
> >
>
>
>
>
> --
> Sven Reimers
>
> * Senior Expert Software Architect
> * Java Champion
> * NetBeans Dream Team Member: http://dreamteam.netbeans.org
> * Community Leader NetBeans: http://community.java.net/netbeans
> Desktop Java:
> http://community.java.net/javadesktop
> * JUG Leader JUG Bodensee: http://www.jug-bodensee.de
> * Duke's Choice Award Winner 2009
> * Blog: https://www.java.net//blog/sven
>
> * XING: https://www.xing.com/profile/Sven_Reimers8
> * LinkedIn: http://www.linkedin.com/in/svenreimers
>
> Join the NetBeans Groups:
> * XING: http://www.xing.com/group-20148.82db20
> * NUGM: http://haug-server.dyndns.org/display/NUGM/Home
> * LinkedIn: http://www.linkedin.com/groups?gid=1860468
> http://www.linkedin.com/groups?gid=107402
> http://www.linkedin.com/groups?gid=1684717
> * Oracle: https://mix.oracle.com/groups/18497
More information about the compiler-dev
mailing list