4

We are using h2 database (in-memory, Oracle mode) for unit testing. Since H2 is not currently support TO_DATE method which Oracle has (and we use it). We define the below in one of our setup script:

CREATE ALIAS TO_DATE as '
import java.text.*;
@CODE
java.util.Date toDate(String s, String dateFormat) throws Exception {
  return new SimpleDateFormat(dateFormat).parse(s);
}
';

Once unit test runs, it throws exception as below:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "/org/h2/dynamic/TO_DATE.java:4: warning: Can't initialize javac processor due to (most likely) a class loader problem: java.lang.NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment
public class TO_DATE {
       ^
    at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:84)
    at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:87)
    at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:141)
    at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:53)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:500)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)
    ....<more omitted>
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
  Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.processing.JavacProcessingEnvironment
    at java.lang.ClassLoader.findClass(ClassLoader.java:530)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at lombok.launch.ShadowClassLoader.loadClass(ShadowClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 113 more

It looks like by using lombok in our project, it provides a different compiler or so which is unable to compile this class and fails our test cases.

If we remove lombok dependency and don't use any of the lombok annotations, it's working fine.

What can we do to fix this?

Note: I've shamelessly copied text from this github issue: #1045. But I've encountered the same problem and this issue seems to sum it up very well.

Yuri
  • 2,008
  • 17
  • 36
  • http://stackoverflow.com/questions/25607272/compiling-a-java-class-in-memory-with-lombok-annotations-and-java-jdk-8 looks pretty similar –  Dec 01 '16 at 10:23
  • @RC. Yes I found that one. It looks similar, but because this issue compiles Java classes for H2 memory database, the pipeline does seem different. And the suggested fix (add the proper classpath) did not work: `JAVA_HOME=/usr/lib/jvm/java-8-jdk mvn test` – Yuri Dec 01 '16 at 10:33
  • I would try to add tools.jar to maven dependencies (test scope), see http://stackoverflow.com/questions/3080437/jdk-tools-jar-as-maven-dependency for example –  Dec 01 '16 at 10:54
  • That worked! Want to post it as an answer? So I can mark it? Thanks!! – Yuri Dec 01 '16 at 12:29
  • Cool, let's close this one as a duplicate then, that's the solution in the similar question too. –  Dec 01 '16 at 12:30
  • 1
    Shamelessly copying my answer to that gh issue: The correct workaround is to prevent lombok from being added (see https://gist.github.com/ecfbfac437a61c3ab9c8107ef2e2a81a). – bendem Mar 27 '17 at 12:49
  • Actually in this case the question would be why lombok is available during runtime. It shouldn't. – bric3 Sep 11 '18 at 16:08
  • See issue for more H2-specific workarounds. This is closed, and they wouldn't apply to the more generic duplicate. – OrangeDog Feb 15 '19 at 19:01

0 Answers0