ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – JPA / EclipseLink:了解ClassLoader问题

2019-08-29 08:02:21  阅读:236  来源: 互联网

标签:java jpa eclipselink apache-commons-dbcp classloader


编辑:虽然给出并给出了一个(好的)答案,但这只涉及我的问题中一个相当不重要的部分.这个问题的主要部分仍然是开放的.

我在云项目中使用EclipseLink(2.6.2).该项目是一个打包为WAR文件并部署在Apache Tomcat 8上的Web应用程序.持久化上下文是使用Java代码设置的,我在其中使用entityManagerFactoryBean.setPackagesToScan(packagesToScan)指定要使用的实体.此配置通常按预期工作,其中确切地找到指定包中的实体类.

我现在无法理解何时使用哪个类加载器,尤其是在考虑Tomcat,运行测试和使用不同的连接池实现时.

在包含Tomcat连接池的Apache Tomcat上运行时,使用spring-cloud-connector插件(spring-cloud-spring-service-connector)创建DataSource实例.
在这个设置中,一切都按预期工作,只要我不改变下面描述的类加载器(否则我面对实体类的ClassNotFoundExceptions).

在JUnit和spring-test的帮助下运行单元测试时,使用内存数据库H2(使用spring-jdbc中的EmbeddedDatabaseBuilder)创建DataSource实例.在这个设置中,我必须指定JPA来使用用于DataSource实例的类加载器(JPA属性映射中的键eclipselink.classloader),否则我得到“Object …不是已知的实体类型”.

在嵌入式Apache Tomcat 8中运行测试时,我看不到任何指示正在使用的连接池的消息.在这个设置中,我还必须为单元测试设置类加载器.

如果我将commons-dbcp(2.1.1)添加到我的项目并显式配置spring-cloud-connector插件以使用它而不是Tomcat的连接池,我可以在Tomcat上运行应用程序而无需配置类加载器,但它也适用于上面描述的类加载器规范.

对于测试,与上面概述的方案相比,commons-dbcp不会更改任何内容(因为未使用相应的配置).

摘要:

> Tomcat(Tomcat CP):仅对JPA使用未修改的类加载器
> Tomcat(DBCP):两种变体
>测试:仅使用DataSource的JPA类加载器

你能帮我理解这里的不同之处,并建议一个适合所有情况的简单解决方案吗?我假设DBCP和Spring使用与Tomcat(和Tomcat的连接池)不同的类加载器.

如果您需要更多信息,我很乐意添加它.

编辑:我添加了一个示例项目,其中包含有关如何重现的大型自述文件.

https://github.com/C-Otto/classloaderexample

解决方法:

“当我开始使用mvn tomcat7时,我得到另一个错误:运行,使用Tomcat的
 连接池(CloudDatabaseConfig)并且不重新配置
 classloder(JpaConfig):“

您必须在maven插件上配置PostreSQL依赖项.你发现ClassNot是因为PostgreSQL JAR不在路径中:

<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <port>8080</port>
    <path>/</path>
  </configuration>
  <!-- For any extra dependencies needed when running embedded Tomcat (not WAR dependencies) add them below -->
  <dependencies>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>9.4-1206-jdbc41</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</plugin>

还看看https://tomcat.apache.org/maven-plugin-2.2/run-mojo-features.html

我忘了在(JpaConfigWithDatasourceClassloader.getJPAProperties)中包含类加载器更改:

properties.put(CLASSLOADER, new java.net.URLClassLoader(
   ((java.net.URLClassLoader)classLoader).getURLs(), JpaConfigWithDatasourceClassloader.class.getClassLoader()  ) 
) ;

有了这个,您可以使用tomcat7:run运行所有变体

标签:java,jpa,eclipselink,apache-commons-dbcp,classloader
来源: https://codeday.me/bug/20190829/1758672.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有