Siguiente respuesta aceptada para la pregunta sobre cómo iniciar runscript desde la carpeta de recursos: problema con INIT=RUNSCRIPT y rutas relativas .
Cadena de conexión:
jdbc:h2:mem:;INIT=RUNSCRIPT FROM 'classpath:desktop/core/database/databaseCreation.sql'Sin embargo, recibo la excepción de que el archivo no se encuentra incluso cuando el archivo está presente.
Excepción:
org.h2.jdbc.JdbcSQLNonTransientException: IO Exception: "java.io.FileNotFoundException: resource /desktop/core/database/databaseCreation.sql"; "classpath:desktop/core/database/databaseCreation.sql"; SQL statement: RUNSCRIPT FROM 'classpath:desktop/core/database/databaseCreation.sql' [90031-210] at com.h2database@2.1.210/org.h2.message.DbException.getJdbcSQLException(DbException.java:573) at com.h2database@2.1.210/org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at com.h2database@2.1.210/org.h2.message.DbException.get(DbException.java:216) at com.h2database@2.1.210/org.h2.message.DbException.convertIOException(DbException.java:461) at com.h2database@2.1.210/org.h2.command.dml.ScriptBase.openInput(ScriptBase.java:168) at com.h2database@2.1.210/org.h2.command.dml.RunScriptCommand.update(RunScriptCommand.java:52) at com.h2database@2.1.210/org.h2.command.CommandContainer.update(CommandContainer.java:174) at com.h2database@2.1.210/org.h2.command.Command.executeUpdate(Command.java:252) at com.h2database@2.1.210/org.h2.engine.Engine.openSession(Engine.java:279) at com.h2database@2.1.210/org.h2.engine.Engine.createSession(Engine.java:201) at com.h2database@2.1.210/org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) at com.h2database@2.1.210/org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at com.h2database@2.1.210/org.h2.Driver.connect(Driver.java:59) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:252) at ispfdesktop/desktop.core.database.DatabaseManager.connectToInMemoryDatabase(DatabaseManager.java:184) at ispfdesktop/desktop.core.database.CRUDTests.setUpBeforeClass(CRUDTests.java:21) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:126) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptBeforeAllMethod(TimeoutExtension.java:68) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllMethods$9(ClassBasedTestDescriptor.java:384) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllMethods(ClassBasedTestDescriptor.java:382) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:196) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:78) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:136) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) Caused by: java.io.FileNotFoundException: resource /desktop/core/database/databaseCreation.sql at com.h2database@2.1.210/org.h2.store.fs.disk.FilePathDisk.newInputStream(FilePathDisk.java:386) at com.h2database@2.1.210/org.h2.store.fs.FileUtils.newInputStream(FileUtils.java:267) at com.h2database@2.1.210/org.h2.command.dml.ScriptBase.openInput(ScriptBase.java:166) ... 69 moreIntentar acceder al archivo usando getResource (la clase DatabaseManager está en el paquete desktop.core.database) indica que el archivo existe:
String file = DatabaseManager.class.getResource("databaseCreation.sql").getFile(); boolean yes = new File(file).exists(); // yes is trueProbado en la plataforma Windows (10) y Linux (Kubuntu) y usando h2 de la versión 2.1.210.
ACTUALIZACIÓN #1
El archivo se encuentra cuando está en la carpeta classpath:databaseCreation.sql , pero aún no cuando está en alguna subcarpeta como escritorio/núcleo/base de datos.
Agregar '/' antes de la primera subcarpeta no funciona.
Intenté poner el archivo sql en todas las carpetas.
'classpath:desktop/core/database/databaseCreation.sql' no funciona
'classpath:desktop/core/databaseCreation.sql' no funciona
'classpath:desktop/databaseCreation.sql' no funciona
solo esto funciona
'classpath:databaseCreation.sql'
Sin usar classpath:
Sin usar classpath, el archivo puede estar en cualquier subcarpeta, pero de esta manera, necesito usar la ruta absoluta al archivo:
jdbc:h2:mem:;INIT=RUNSCRIPT FROM '<absolute path here>' Dejo la pregunta abierta ya que la pregunta a la que se hace referencia tiene una respuesta desactualizada, que no funciona en la versión actual de H2 y quiere saber cómo hacer que funcione usando classpath .
ACTUALIZACIÓN #2
Para replicar, debe usar el sistema modular Java (module-info.java) en el proyecto.
ACTUALIZACIÓN: (módulo-info.java)
Según su comentario, su configuración original usaba módulos JDK 9+. Ese es un tema complejo y confuso. Sería más fácil simplemente eliminar module-info.java y no usar módulos. Si tiene la intención de usar módulos y mantener los recursos en un directorio separado (módulo), hay múltiples opciones sin una opción clara. Quizás la opción más fácil sería abrir el "paquete" que contiene el recurso. Algo como esto funcionó en mi prueba local:
module myAppModule { exports desktop.core.database; opens desktop.core.database; requires java.sql; requires org.junit.jupiter.api; }Más información:
ORIGINAL
No pude replicar su problema usando una configuración maven muy simple con solo el tiempo de ejecución H2 como dependencia (misma versión, 2.1.210) junto con JUnit 5. Funcionó como se esperaba.
El seguimiento de la pila muestra que esto se está ejecutando como una prueba desde dentro de Eclipse. Podría replicar su problema exactamente en Eclipse si agregara manualmente src/main/resources como una carpeta de origen de Java Build Path, pero con una exclusión de **/ que excluiría los subdirectorios de recursos.
Si está utilizando maven, tal vez intente ejecutar en la línea de comandos con mvn test para verificar que no sea su configuración de Eclipse.
De lo contrario, deberá publicar más información para obtener ayuda.