Una prueba de unidad simple (sin junit) da una extraña excepción
import java.io.StringReader; import java.sql.PreparedStatement; import org.codehaus.janino.SimpleCompiler; public class TestJanino { public void testJanino() throws Exception { PreparedStatement ps = null; String sampleClass = "import java.sql.PreparedStatement; public class Test{}"; SimpleCompiler sc = new SimpleCompiler(); sc.setParentClassLoader(getClass().getClassLoader()); sc.cook("Test.java", new StringReader(sampleClass)); System.out.println(sc.getBytecodes().size()); } public static void main(String[] args) throws Exception { TestJanino d = new TestJanino(); d.testJanino(); } }El mensaje es:
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ xx.xxx.server.nn --- [WARNING] useSystemClassloader setting has no effect when not forking [INFO] Surefire report directory: D:\workspace\XXXX\xx.xxx.server.nn\target\surefire-reports ------------------------------------------------------- TESTS ------------------------------------------------------- Running xx.xxx.server.nn.TestJanino Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec <<< FAILURE! xx.xxx.server.nn.TestJanino.testJanino() Time elapsed: 0.056 sec <<< FAILURE! org.codehaus.commons.compiler.CompileException: File 'Test.java', Line 1, Column 1: A class "java.sql.PreparedStatement" could not be found at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:12679) at org.codehaus.janino.UnitCompiler.getSingleTypeImport(UnitCompiler.java:10639) at org.codehaus.janino.UnitCompiler.checkForConflictWithSingleTypeImport(UnitCompiler.java:454) at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:410) at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:231) at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:391) at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:386) at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1692) at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:386) at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:359) at org.codehaus.janino.UnitCompiler.access$000(UnitCompiler.java:231) at org.codehaus.janino.UnitCompiler$1.visitCompilationUnit(UnitCompiler.java:333) at org.codehaus.janino.UnitCompiler$1.visitCompilationUnit(UnitCompiler.java:330) at org.codehaus.janino.Java$CompilationUnit.accept(Java.java:367) at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:330) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:245) at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:473) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:223) at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:209) at xx.xxx.server.nn.TestJanino.testJanino(TestJanino.java:14) Results : Failed tests: xx.xxx.server.nn.TestJanino.testJanino(): File 'Test.java', Line 1, Column 1: A class "java.sql.PreparedStatement" could not be found Tests run: 1, Failures: 1, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.738 s [INFO] Finished at: 2021-12-14T07:52:08+01:00 [INFO] ------------------------------------------------------------------------Pero si ejecuto el principal sin maven, se resuelve:
¿Cómo es eso posible?
Este es mi pom.xml :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>xx.xxx</groupId> <version>xxx-SNAPSHOT</version> <properties> <forkMode>never</forkMode> </properties> <artifactId>xxx</artifactId> <dependencies> <dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.1.6</version> </dependency> </dependencies> </project>Finalmente pude reproducir su problema con Java 11 y Maven 3.8.
Como se indica en los comentarios de la pregunta, el problema parece estar relacionado con el hecho de que el complemento seguro de Maven no utiliza el cargador de clases del sistema. Por favor, considere leer la documentación pertinente .
Puede verificar ese punto usando la siguiente configuración del complemento:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> </plugins> </build>No está proporcionando esta configuración explícitamente, sino como se indica en el seguimiento de Maven:
... [WARNING] useSystemClassloader setting has no effect when not forking ... no está utilizando bifurcación, que es coherente con la configuración proporcionada en su pom.xml :
<properties> <forkMode>never</forkMode> </properties>Para resolver el problema, puede eliminar esa configuración y la prueba se ejecutará sin más problemas.
Habiendo dicho eso, como también dije en los comentarios, probé el código con diferentes versiones de Maven y JDK 8 y funcionó incluso configurando useSystemClassloader en false , por lo que honestamente no puedo decirle la razón exacta del problema, probablemente puede haber que ver con la versión JDK, pero podría ser la versión Maven o incluso Janino también.