Я работаю над приложением, которое требует использования как JPA / Hibernate, так и RMI. Поскольку RMI требует использования Политики безопасности, чтобы удостовериться, что доступ к сети назначен правильно, я также теперь должен беспокоиться о разрешениях для папки.
Я искал в Интернете (и здесь, на SO) пару дней, пытаясь найти решение этой проблемы. В основном проблема в том, что для работы JPA / Hibernate мне нужно поместить файл persistence.xml
в каталог META-INF
, а каталог META-INF
должен находиться в каталоге src
моего проекта (что не делает толку мне тоже но это работает). Так что макет проекта в основном:
org.project.root
|
|>src
| |
| |>org.project.package
| |
| |>META-INF
| |
| |>persistence.xml
|
|>config
|
|>database
|
|>logs
Мой файл политики безопасности. Я пытался предоставить доступ на чтение к папке ${user.dir}${/}src${/}META-INF${/}-
, однако при попытке запустить приложение выдает ошибку No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE
. Мой файл persistence.xml, однако, содержит это, и он работает, когда закомментируйте все RMI и перестанете читать политику безопасности. Поэтому мой вопрос заключается в том, как мне получить файл политики безопасности, позволяющий мне читать файл persistence.xml?
ОБНОВЛЕНИЕ 1
Используя предложенную информацию о пути от @Vineet Reynolds, я могу увидеть путь к файлу, используя:
File f = new File("META-INF/persistence.xml");
System.out.println(f.getAbsolutePath());
Однако, я все еще получаю эту ошибку, когда пытаюсь создать базу данных.
javax.persistence.PersistenceException: No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
at org.myproject.data.DBInit.dbInit(DBInit.java:29)
at org.myproject.ACPStoreMainService.main(ACPStoreMainService.java:91)
Мой файл persistence.xml, как я уже сказал, работал нормально, прежде чем я начал использовать политику безопасности, поэтому я знаю, что модуль постоянства "DERBY_ACPSTORE_CREATE" присутствует и исправен.
Обновление 2
Хотя я не уверен, что это хорошо, так как это работало, когда я не использую Политику безопасности, вот мое содержание persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="DERBY_ACPSTORE_CREATE">
<provider>org.hibernate.ejb.HibernatePersistence</provider
<class>org.myproject.data.MessageHistory</class>
<properties>
<property name="hibernate.connection.driver_class"
value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
<property name="hibernate.connection.url" value="jdbc:derby:database/acpstore;create=true" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="use_sql_comments" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.connection.username" value="user" />
<property name="hibernate.connection.password" value="password" />
</properties>
</persistence-unit>
</persistence>
ОБНОВЛЕНИЕ 3
Как я уже упоминал в комментарии к ответу Vineet Reynolds ниже, я протестировал файл persistence.xml без защиты и теперь он работает. Затем, когда я восстанавливаю политику безопасности, я снова получаю ошибки. Ниже приведено содержание моей политики безопасности и порядок ее создания в приложении:
grant {
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.RuntimePermission "readFileDescriptor";
permission java.lang.RuntimePermission "writeFileDescriptor";
permission java.util.PropertyPermission "user.dir", "read";
permission java.net.SocketPermission "172.10.10.21:1024-65535", "connect, accept, resolve";
permission java.net.SocketPermission "172.10.10.21:1-1023", "connect,resolve";
permission java.io.FilePermission "${user.dir}${/}META-INF${/}-", "read";
permission java.io.FilePermission "${user.dir}${/}config${/}-", "read, write, delete";
permission java.io.FilePermission "${user.dir}${/}database${/}-", "read, write, delete";
};
И это то, что происходит в моем приложении для установки менеджера безопасности
if(System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
ОБНОВЛЕНИЕ 4
Я нашел сообщение, которое не заметил до прихода из log4j. Сообщение
[main] INFO org.hibernate.ejb.Ejb3Configuration - Could not find any META-INF/persistence.xml file in the classpath
что странно для меня. Поэтому я перечислил каталоги в classpath и нашел org.project.root\bin
, но не org.project.root
. Теперь я знаю, что META-INF во время выполнения расположен как org.project.root\META-INF
, и что путь к классу должен указывать на org.project.root
, чтобы JPA и hibernate могли получить доступ к файлам persistence.xml. Так может ли быть так, что мне нужно как-то изменить путь к классу, чтобы он соответствовал этому?