【发布时间】:2016-04-18 20:05:57
【问题描述】:
我已经(使用 Eclipse)编写了一个使用 JPA 的小程序。现在我想使用命令行手动编译和运行这个程序。我还将所有源文件放在一个单独的目录中(不在 Eclipse 的工作空间中)。目录如下:
directory
|- src
| |- javax
| | |- persistence
| | |- <...>
| |- main
| |- META-INF
| | |- javax
| | | |- persistence
| | |- persistence.xml
| |
| |- <..>
|- run.bat
注意:我故意有 2 个 javax 目录,其中包含所有类文件。
run.bat 包含行:
javac -cp ./src ./src/main/Main.java
java -cp ./src main.Main
据我了解,我收到错误不是因为 META-INF/persistence.xml 文件的问题(不像 stackoverflow 上的许多其他人)。我这么说是因为我在 Main 中写了以下几行:
<...>
Thread.currentThread().setContextClassLoader(new ClassLoader() {
@Override
public Enumeration<URL> getResources(String name) throws IOException {
System.out.println("resource requested=" + name);
if (name.equals("META-INF/services/javax.persistence.spi.PersistenceProvider")) {
<--- MARK ---> return Collections.enumeration(Arrays.asList(new File("src/javax/persistence/spi/PersistenceProvider.class")
.toURI().toURL()));
} else if (name.equals("META-INF/persistence.xml")) {
return Collections.enumeration(Arrays.asList(new File("src/META-INF/persistence.xml")
.toURI().toURL()));
}
return super.getResources(name);
}
});
emFactory = Persistence.createEntityManagerFactory("uzduotis");
<...>
所以当我启动 run.bat 时,程序会打印:
resource name=name=META-INF/services/javax.persistence.spi.PersistenceProvider
(它永远不会到达程序要求“META-INF/persistence.xml”资源的部分)
然后它会中断并给我一个错误:
如果我将 MARKED 语句更改为
return super.getResources("src/" + name);
然后错误只说:
我错过了什么?
Peristence.xml:
编辑: 程序非常简单:没有休眠,只有几个从 REST 服务检索一些信息并使用它的类,主要使用 javax 和 w3c 外部库。项目浏览器的照片以描述其简单性。
编辑 2. 解决方案
虽然我不完全确定原因,但我找到了一种使它起作用的方法。所以如果有人能回答为什么以下更改解决了这个问题,我很乐意将其标记为答案
我将 eclipselink 和 mysql-connector-java jar 添加到 src 目录中。 eclipselink.jar 修复了这个问题,并且需要 mysql-connector-java.jar,因为我遇到了其他错误(毕竟我正在使用数据库)。最后我从
更改了 run.bat 文件中的行java -cp ./src main.Main
到
java -cp ./src;./src/eclipselink.jar;./src/mysql-connector-java.jar; main.Main
【问题讨论】:
-
也许这个答案会有所帮助:stackoverflow.com/a/1285436/1506009
-
该帖子的哪个部分认为可以解决我的问题?
-
看来您没有在 persistence.xml 文件中指定持久性提供程序。所以我会尝试在链接的答案中指定它。只需尝试在
<persistence unit name="uzduotis">元素中添加<provider>org.hibernate.ejb.HibernatePersistence</provider>。请记住,您需要为 HibernatePersistence 解析依赖项。 -
哦。我可能应该指定我的程序。将很快编辑问题信息。只是让你知道我没有使用休眠,正如我在问题上所说的那样,我不认为这个问题与 persistence.xml 文件,因为这个资源从来没有被请求过。但如果你认为不是这样,请证明我错了
-
好的。在您编辑信息后,我会再次对此进行调查。 ;)
标签: java eclipse jpa command-line