Java 嵌入式GlassFish忽略Maven测试资源

Java 嵌入式GlassFish忽略Maven测试资源,java,jakarta-ee,jpa,maven,glassfish,Java,Jakarta Ee,Jpa,Maven,Glassfish,我已经为几个会话bean编写了单元测试。我已将Maven设置为在src/main/resources/META-INF目录中包含persistence.xml,该目录引用本地MySQL数据库进行开发。我在src/test/resources/META-INF目录中还有另一个persistence.xml,它引用了嵌入式Derby数据库默认值。将测试部署到嵌入式GlassFish 3.1容器中 但是,当我运行测试时,会出现以下错误: java.lang.RuntimeException: java

我已经为几个会话bean编写了单元测试。我已将Maven设置为在src/main/resources/META-INF目录中包含persistence.xml,该目录引用本地MySQL数据库进行开发。我在src/test/resources/META-INF目录中还有另一个persistence.xml,它引用了嵌入式Derby数据库默认值。将测试部署到嵌入式GlassFish 3.1容器中

但是,当我运行测试时,会出现以下错误:

java.lang.RuntimeException: javax.naming.NamingException: Lookup failed for 'jdbc/mylog' 
jdbc/mylog是主目录中持久化单元所指的MySQL数据库。它显然忽略了测试目录中的持久性单元,但我不知道为什么

据我所知,Maven正确地设置了类路径,在类之前设置了测试类,在实际的target/test classes/META-INF目录中查看一下,它复制了正确的嵌入式Derby持久化单元

[DEBUG] Test Classpath :
[DEBUG]   C:\Users\Laurens\Documents\Projects\Mylog\target\test-classes
[DEBUG]   C:\Users\Laurens\Documents\Projects\Mylog\target\classes
[DEBUG]   C:\Users\Laurens\.m2\repository\org\eclipse\persistence\eclipselink\2.2.0\eclipselink-2.2.0.jar
[DEBUG]   C:\Users\Laurens\.m2\repository\org\eclipse\persistence\javax.persistence\2.0.3\javax.persistence-2.0.3.jar
[DEBUG]   C:\Users\Laurens\.m2\repository\org\eclipse\persistence\org.eclipse.persistence.jpa.modelgen.processor\2.2.0\org.eclipse.persistence.jpa.modelgen.processor-2.2.0.jar
[DEBUG]   C:\Users\Laurens\.m2\repository\org\glassfish\extras\glassfish-embedded-all\3.1\glassfish-embedded-all-3.1.jar
[DEBUG]   C:\Users\Laurens\.m2\repository\javax\javaee-web-api\6.0\javaee-web-api-6.0.jar
[DEBUG]   C:\Users\Laurens\.m2\repository\junit\junit\4.8.1\junit-4.8.1.jar

非常感谢任何关于如何让GlassFish使用适当持久性单元的提示!谢谢

所谓“嵌入式glassfish容器”,是指为您运行glassfish的maven插件吗?maven插件的类路径与maven测试类路径不同,管理方式也不同。您可能需要使用不同的类路径。

当使用嵌入式Glassfish运行测试时,JPA提供程序在执行maven surefire插件目标(用于运行测试阶段)之前不使用命令行上显示的类路径。Embedded Glassfish将作为测试范围的一部分可用的构件部署为
散点架构
。这种分散的归档文件通常在
java.io.tmpdir
目录中创建,通常名称为
gfembed,如果您希望尽可能减少更改,而不是从Glassfish安装中复制更改,则会对其进行修改

2。复制persistence.xml文件

可以在Maven POM文件中添加目标,以便在
test
阶段之前,将
persistence.xml
文件从
src/test/resources/META-INF
备份并复制到
src/main/resources/META-INF
。测试阶段完成后,将恢复原始状态。我将不详细介绍这一点,因为类似的解决方案已在中讨论过。我没有在集成测试中使用这种方法,因为我需要在
persistence.xml
中可以进行的更改之外进行更改,比如创建自定义领域。但是,我将它用于单元测试,因为JPA提供程序将从
target/classes
而不是
target/test classes
获取
persistence.xml
文件,尽管后者以类路径顺序出现在前面。如果您使用Hibernate作为JPA提供程序,那么为
org.Hibernate.ejb
记录器启用跟踪日志记录(因为
Ejb3Configuration
类负责执行查找)将使您确信
测试类中的文件将不会被拾取


注意:


大多数答案都假设Glassfish 3.1,但可能也适用于即将发布的版本。

这个答案听起来可能很傻,但我正在寻找一种方法,让我可以通过
以运行方式运行那些来自eclipse的测试。我就是这样做的:

@BeforeClass
public static void setUp() throws IOException {
    Files.copy(new File("target/test-classes/META-INF/persistence.xml"), new File("target/classes/META-INF/persistence.xml"));
    // ...
}

我只是将test/persistence.xml复制到classes/persistence.xml。这很有效

嗨,瑞安,谢谢你的快速回复!我没有使用插件。我的POM中有glassfish-embedded-all-3.1作为测试范围的依赖项。@Laurens:那么您的测试类在运行测试的同一JVM中启动glassfish?我不熟悉GF,但你所描述的听起来确实不对。你能提供一个小的,可执行的问题的例子吗?是的。我的印象是,这就是使用嵌入式GlassFish进行单元测试的全部意义,因此您不需要在构建服务器上进行完整安装。我利用Vineets的建议设法使事情运转起来。无论如何,非常感谢!在不同的体系结构条件下,我遇到了类似的问题,肮脏的解决方案是将persistente单元、生产和测试合并到一个persistence.xml中!我选择了选项一,认为它是最灵活的,现在它工作得完美无缺。万分感谢@劳伦斯,很高兴知道这有帮助。回答得很好,维尼特。Embedded Glassfish在升级到3.1.2后停止为我工作,但在按照您在这里解释的操作后,我成功地使其重新工作。谢谢
<domain log-root="${com.sun.aas.instanceRoot}/logs" application-root="${com.sun.aas.instanceRoot}/applications" version="10.0">
  <system-applications/>
  <applications/>
  <resources>
    <jdbc-resource pool-name="MyPool" jndi-name="jdbc/mylog"/>
    ...
    <jdbc-connection-pool driver-classname="" datasource-classname="org.apache.derby.jdbc.ClientDataSource" res-type="javax.sql.DataSource" description="" name="MyPool" ping="true">
      <property name="User" value="APP"></property>
      <property name="RetrieveMessageText" value="true"></property>
      <property name="CreateDatabase" value="true"></property>
      <property name="ServerName" value="localhost"></property>
      <property name="Ssl" value="off"></property>
      <property name="SecurityMechanism" value="4"></property>
      <property name="TraceFileAppend" value="false"></property>
      <property name="TraceLevel" value="-1"></property>
      <property name="PortNumber" value="1527"></property>
      <property name="LoginTimeout" value="0"></property>
      <property name="Password" value="APP"></property>
      <property name="databaseName" value="MYDB"></property>
    </jdbc-connection-pool>
    ...
  </resources>
  <servers>
    <server name="server" config-ref="server-config"> 
      <resource-ref ref="jdbc/__TimerPool"/>
      <resource-ref ref="jdbc/__default"/>
      <resource-ref ref="jdbc/mylog"/>
    </server>
  </servers>
  ...
...
@BeforeClass
public static void setUp() throws IOException {
    Files.copy(new File("target/test-classes/META-INF/persistence.xml"), new File("target/classes/META-INF/persistence.xml"));
    // ...
}