sviperll / adt4j

adt4j - Algebraic Data Types for Java
BSD 3-Clause "New" or "Revised" License
143 stars 8 forks source link

java.lang.NoClassDefFoundError: javax/annotation/ParametersAreNonnullByDefault: javax.annotation.ParametersAreNonnullByDefault #28

Closed io7m closed 8 years ago

io7m commented 8 years ago

When using the shaded artifact in a project with no other dependencies, the code generator says:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project adt4j_test: Fatal error compiling
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Fatal error compiling
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:836)
    at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    ... 20 more
Caused by: org.codehaus.plexus.compiler.CompilerException: java.lang.NoClassDefFoundError: javax/annotation/ParametersAreNonnullByDefault
    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:172)
    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:169)
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825)
    ... 23 more
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/annotation/ParametersAreNonnullByDefault
    at com.sun.tools.javac.main.Main.compile(Main.java:553)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:125)
    ... 25 more
Caused by: java.lang.NoClassDefFoundError: javax/annotation/ParametersAreNonnullByDefault
    at com.github.sviperll.adt4j.internal.com.github.sviperll.adt4j.model.ValueClassModelFactory.createValueClass(ValueClassModelFactory.java:149)
    at com.github.sviperll.adt4j.internal.com.github.sviperll.adt4j.model.ValueClassModelFactory.createValueClass(ValueClassModelFactory.java:67)
    at com.github.sviperll.adt4j.GenerateValueClassForVisitorProcessor.processElements(GenerateValueClassForVisitorProcessor.java:101)
    at com.github.sviperll.adt4j.GenerateValueClassForVisitorProcessor.process(GenerateValueClassForVisitorProcessor.java:85)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at com.sun.tools.javac.main.Main.compile(Main.java:523)
    ... 28 more
Caused by: java.lang.ClassNotFoundException: javax.annotation.ParametersAreNonnullByDefault
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 40 more

An example project here reproduces it:

https://github.com/io7m/adt4j_test

sviperll commented 8 years ago

It's seems that you additionally need com.google.code.findbugs:annotations package

        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>annotations</artifactId>
            <version>2.0.3</version> <!-- Any version should work -->
        </dependency>

We may need to add an option not to use additional annotations... You can add missing dependency as a workaround for now.

io7m commented 8 years ago

Do the annotations appear in the generated code? If so, it might be preferable to add an option to specify which @Nonnull class to use, as there are many competing standards.

sviperll commented 8 years ago

Yes, It's currently not configurable. There should be some kind of

    enum NonnullAnnotaionFlavour {
        NONE,
        FINDBUGS_ANNOTATIONS,
        CHECKERFRAMEWORK,
        // ...
    }
io7m commented 8 years ago

Would it be possible to simply specify a fully-qualified name of an annotation?

sviperll commented 8 years ago

I've released 3.0-rc1 version. javax.annotation.Nullable, javax.annotation.Nonnull and javax.annotation.ParametersAreNonnullByDefault are used only if these classes are present in classpath during compilation