Мое приложение отлично работает с toplink, но мне нужны некоторые функции eclipselink, поэтому я решил поменять местами.
Я сменил провайдера в persistence.xml
кому:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
и добавил следующее свойство (хотя я не уверен, нужно ли это):
<property name="eclipselink.target-server" value="SunAS9"/>
Я пробовал упаковку eclipselink.jar
с моим приложением, и я попытался вставить его $GFHOME/lib
и добавив его в суффикс пути к классам через пользовательский интерфейс администратора glassfish. Что бы я ни делал, я получаю:
Exception [EclipseLink-28018] (Eclipse Persistence Services - 1.1.3.v20091002-r5404): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [MYAPP] failed.
Internal Exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 1.1.3.v20091002-r5404): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [MYAPP] failed.
Internal Exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:878)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:216)
at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:149)
at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:84)
at com.sun.enterprise.server.AbstractLoader.loadPersistenceUnits(AbstractLoader.java:895)
at com.sun.enterprise.server.ApplicationLoader.doLoad(ApplicationLoader.java:184)
at com.sun.enterprise.server.TomcatApplicationLoader.doLoad(TomcatApplicationLoader.java:126)
<snip>
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 1.1.3.v20091002-r5404): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [MYAPP] failed.
Internal Exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:210)
... 82 more
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:594)
at java.lang.ClassLoader.<init>(ClassLoader.java:202)
at java.security.SecureClassLoader.<init>(SecureClassLoader.java:53)
at com.sun.enterprise.loader.EJBClassLoader$DelegatingClassLoader.<init>(EJBClassLoader.java:1368)
at com.sun.enterprise.loader.EJBClassLoader.copy(EJBClassLoader.java:384)
at com.sun.enterprise.server.PersistenceUnitInfoImpl.getNewTempClassLoader(PersistenceUnitInfoImpl.java:216)
at org.eclipse.persistence.platform.server.ServerPlatformBase.getNewTempClassLoader(ServerPlatformBase.java:477)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:741)
... 81 more
и приложение не развертывается.
Изменить - я попытался изменить настройки безопасности, но столкнулся с другой проблемой.
Я бы хотел, чтобы следующее (уже в server.policy) разрешило eclipselink.jar
полный доступ, но видимо нет.
// Core server classes get all permissions by default
grant codeBase "file:${com.sun.aas.installRoot}/lib/-" {
permission java.security.AllPermission;
};
Я добавил следующее:
grant {
permission java.security.AllPermission;
};
И теперь я получаю:
WARNING: "IOP00810257: (MARSHAL) Could not load class org.eclipse.persistence.indirection.IndirectList"
на стороне клиента
редактировать который я только что понял, это GlassFish v2.1 - заставляем Application Client и Eclipselink работать вместе? и убедившись, что jar связан с приложением, теперь оно работает.
Основная причина заключается в том, что GlassFish работает с включенным SecurityManager, а EclipseLink не имеет всех необходимых разрешений для работы в GlassFish V2. TopLink Essentials имеет специальные разрешения для GlassFish, и для решения вашей проблемы просто распространите эти разрешения на EclipseLink. это блог подробно описывает, как настроить политику безопасности для GlassFish.
--Гордон