mkarneim / pojobuilder

A Java Code Generator for Pojo Builders
Other
334 stars 44 forks source link

Java 9 error java.lang.NoClassDefFoundError: javax/annotation/Generated #148

Closed vostapets closed 6 years ago

vostapets commented 6 years ago

Hello. I am trying to use pojobuilder 4.1.0 with Java 9. Please help me with error. I used example https://github.com/mkarneim/pojobuilder#annotating-a-constructor

public class Contact {
    private final String surname;
    private final String firstname;
    private String email;

    @GeneratePojoBuilder
    public Contact(String surname, String firstname) {
        this.surname = surname;
        this.firstname = firstname;
    }
   ...

I am building maven on java 9.

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>9</source>
                    <target>9</target>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>

Error:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project pojobuilder-simple: Compilation failure
[ERROR] 
[ERROR] java.lang.NoClassDefFoundError: javax/annotation/Generated
[ERROR] at net.karneim.pojobuilder.sourcegen.BuilderSourceGenerator.generateSource(BuilderSourceGenerator.java:84)
[ERROR] at net.karneim.pojobuilder.sourcegen.BuilderSourceGenerator.generateSource(BuilderSourceGenerator.java:57)
[ERROR] at net.karneim.pojobuilder.processor.AnnotationProcessor.generateBuilderImpl(AnnotationProcessor.java:238)
[ERROR] at net.karneim.pojobuilder.processor.AnnotationProcessor.generateSources(AnnotationProcessor.java:218)
[ERROR] at net.karneim.pojobuilder.processor.AnnotationProcessor.process(AnnotationProcessor.java:139)
[ERROR] at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:968)
[ERROR] at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:884)
[ERROR] at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2200(JavacProcessingEnvironment.java:108)
[ERROR] at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1206)
[ERROR] at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1315)
[ERROR] at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1246)
[ERROR] at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:922)
[ERROR] at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
[ERROR] at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
[ERROR] at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
[ERROR] at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
[ERROR] at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:126)
[ERROR] at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:174)
[ERROR] at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1075)
[ERROR] at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:168)
[ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
[ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
[ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
[ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
[ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
[ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:564)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
[ERROR] at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
[ERROR] Caused by: java.lang.ClassNotFoundException: javax.annotation.Generated
[ERROR] at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
[ERROR] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:563)
[ERROR] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
[ERROR] ... 43 more
[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
mkarneim commented 6 years ago

Seems that Oracle removed the @Generated annotation from Java 9.

Guess we have to substitute it with javax.annotation.processing.Generated for Java 9+.

mkarneim commented 6 years ago

QueryDsl, autovalue and others have the same issue: https://github.com/querydsl/querydsl/issues/2242

vostapets commented 6 years ago

Thank you. I checked auto-value. They fixed for the latest version. https://github.com/google/auto/issues/560#issuecomment-352201816

vostapets commented 6 years ago

Hi, @mkarneim Looks like issues: https://github.com/mkarneim/pojobuilder/blob/f77aab531b4b4268932716179b65f04e6ae18f36/src/main/java/net/karneim/pojobuilder/sourcegen/BuilderSourceGenerator.java#L84 https://github.com/mkarneim/pojobuilder/blob/f77aab531b4b4268932716179b65f04e6ae18f36/src/main/java/net/karneim/pojobuilder/sourcegen/BuilderSourceGenerator.java#L126 https://github.com/mkarneim/pojobuilder/blob/d6b46ffd957e4b71d35f1c37e2c1ab1915cb7f53/src/main/java/net/karneim/pojobuilder/sourcegen/ManualBuilderSourceGenerator.java#L38 https://github.com/mkarneim/pojobuilder/blob/d6b46ffd957e4b71d35f1c37e2c1ab1915cb7f53/src/main/java/net/karneim/pojobuilder/sourcegen/ManualBuilderSourceGenerator.java#L58

Can we delete dependency to Generator class?

mkarneim commented 6 years ago

I am currently working on this issue and planing to release a fix tomorrow or Wednesday.

Anyway, if you want to fix this yourself on your fork, removing the annotation from the source should do it. However, this would break the recommended conventions, saying that generated code should be marked accordingly.

vostapets commented 6 years ago

Great, thank you.

michaelpog commented 6 years ago

@mkarneim if that annotation is removed. How is the code going to be generated then?

mkarneim commented 6 years ago

I guess this is a misunderstanding. ‘’‘@Generated‘‘‘ is not responsible for code generation.

michaelpog commented 6 years ago

So which version actually fixes the issue? I've moved to version 4.2.0 and I am still getting a


Fatal error compiling: java.lang.NoClassDefFoundError: javax/annotation/Generated: javax.annotation.Generated 
``` error

What steps do I need to take to by pass this error?
Thank you
mkarneim commented 6 years ago

This is interesting. And yes, version 4.2.0 is the fixed one. Can you give me more details so that I can reproduce it, like build script, compiler version, source code?

mkarneim commented 6 years ago

Here is a little Java 9 Gradle project that shows that PojoBuilder 4.2.0 works with Java 9.

build.gradle

task wrapper(type: Wrapper) { gradleVersion = '4.5.1' }

apply plugin: 'java'
apply plugin: 'eclipse'

group = 'sample'
version = '1.0.0'
sourceCompatibility = 1.9
eclipse.jdt.sourceCompatibility = 1.9

repositories {
  mavenCentral()
}

dependencies {
  compile 'net.karneim:pojobuilder:4.2.0'
  testCompile 'junit:junit:4.12'
}

tasks.withType(JavaCompile) { options.encoding = "UTF-8" }

gradle.properties

# set the java home to java 1.9 if this isn't already default on your system
org.gradle.java.home=C:/Program Files/Java/jdk-9.0.1

src/main/java/dummy/Contact.java

package dummy;

import net.karneim.pojobuilder.GeneratePojoBuilder;

@GeneratePojoBuilder
public class Contact {
  public String name;
  public String email;
}

src/test/java/dummy/ContactTest.java

package dummy;

import org.junit.*;
import static org.junit.Assert.assertEquals;

public class ContactTest {
  @Test
  public void test() {
    Contact c = new ContactBuilder().withEmail("mm").withName("xx").build();
    assertEquals("c.name", "xx", c.name);
  }
}

You can build this project from the command line with:

gradlew clean build