Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

488
Vistas
Problema al configurar el script de inicio de H2. El archivo no se encuentra cuando el script no está en la carpeta raíz de classpath mientras se usa el sistema modular Java

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.

presente archivo

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 more

Intentar 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 true

Probado 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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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:

  • https://www.oracle.com/corporate/features/understanding-java-9-modules.html
  • Cargando clases y recursos en Java 9
  • Acceso a archivos de recursos en un módulo de rompecabezas de Java
  • Cómo acceder a los recursos usando el cargador de clases en Java 9
  • Acceso a archivos de recursos desde módulos externos

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda