Why/Where Eclipse 是否会注入额外的库,例如 JPA 1.0?

Why/Where does Eclipse inject extra libraries such as JPA 1.0?

我在 Eclipse 上下文中尝试 运行 任何内容时突然遇到此错误:

Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;

我知道这是旧的 JPA 1.0 规范正在使用,而我的项目使用 JPA 2.0。我可以 运行 我的 unit/integration 通过 Maven 和 IDEA 测试没有问题,但是如果我 运行 在 Eclipse 中测试它们(尝试过 Kepler 和 Luna),我会得到错误。

稍微挖掘一下,我发现旧库是通过 ProjectClassLoader 注入的:

ProjectClassLoader: entry= $HOME/.m2/repository/javax/persistence/persistence-api/1.0.2/persistence-api-1.0.2.jar

但是它没有出现在我的 Maven 依赖项或传递依赖项中。这不是我第一次看到这个。上次我删除了我的项目并重新创建了它,但这次该方法失败了。我也试过禁用 JPA Facet。

我该如何解决这个问题?

有2个地方可以看。两者都在项目属性下。

首先,如果您的项目正在使用构面,请查看该部分。三个将是为 JPA 列出的方面。应该检查它,右边的下拉应该是 2.0(或 2.1)。

接下来还有一个 JPA 选项卡。它下面有几个选项卡,但主要是设置 JPA 版本并指定实现。这可能是您拉入 1.0 jar 的地方。

如果你打开了分面,确保这两个地方是一致的。您可以很容易地使它们不同步,弄清楚这很令人困惑和烦人。

我终于能够 "solve" 这 -- 至少让自己重新开始工作。这是我所做的:

  1. 在 Eclipse 中删除了我的项目
  2. 删除了 .classpath 和 磁盘上的 .project 文件(例如找到 .-name ".classpath" | xargs rm)
  3. 重新导入了我的 Maven 项目

神奇的是,JPA 1.0 不再包含在该项目中。 @Terry 有一些很好的信息,但根据他的笔记,我的配置似乎是正确的。我认为这只是一种解决方法,Eclipse Luna 中可能潜伏着与此相关的错误。