Maven Glassfish无法在模块中定位javax.persistence.persistence
我面临着和你一样的问题。我可以无错误地部署应用程序,但当我尝试查看索引页时,我发现一个错误,其根本原因如下:Maven Glassfish无法在模块中定位javax.persistence.persistence,maven,jpa,glassfish,classloader,Maven,Jpa,Glassfish,Classloader,我面临着和你一样的问题。我可以无错误地部署应用程序,但当我尝试查看索引页时,我发现一个错误,其根本原因如下: [#|2014-06-02T16:53:37.524+0100|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=18;_ThreadName=Thread-2;|StandardWrapperValve[Faces Servlet]: PWC1406
[#|2014-06-02T16:53:37.524+0100|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=18;_ThreadName=Thread-2;|StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.ClassNotFoundException: javax.persistence.Persistence
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at my.database.manager.PersistenceStoreManagerImpl.init(PersistenceStoreManagerImpl.java:57)
at my.database.manager.PersistenceStoreManagerImpl.getInstance(PersistenceStoreManagerImpl.java:76)
at my.database.manager.PersistenceCRUDManagerImpl.<init>(PersistenceCRUDManagerImpl.java:49)
at my.database.model.Serviceprovider.<clinit>(Serviceprovider.java:40)
at my.server.web.contoller.ServiceProviderController.findAll(ServiceProviderController.java:205)
at my.server.web.contoller.ServiceProviderController.init(ServiceProviderController.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:267)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:263)
at org.jboss.weld.introspector.jlr.WeldMethodImpl.invoke(WeldMethodImpl.java:174)
at org.jboss.weld.bean.AbstractClassBean.defaultPostConstruct(AbstractClassBean.java:398)
at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.postConstruct(ManagedBean.java:174)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:294)
at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:107)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:90)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:104)
at my.server.web.contoller.ServiceProviderController$Proxy$_$$_WeldClientProxy.showViewDataTable(ServiceProviderController$Proxy$_$$_WeldClientProxy.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
at com.sun.el.parser.AstValue.getValue(AstValue.java:134)
at com.sun.el.parser.AstValue.getValue(AstValue.java:183)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:169)
at com.sun.faces.renderkit.html_basic.OutputLinkRenderer.getValue(OutputLinkRenderer.java:182)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
at com.sun.faces.renderkit.html_basic.OutputLinkRenderer.renderAsActive(OutputLinkRenderer.java:191)
at com.sun.faces.renderkit.html_basic.OutputLinkRenderer.encodeBegin(OutputLinkRenderer.java:107)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1755)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
MyServer persistence.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="my_persistence_unit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>my_persistence_unit</jta-data-source>
<class>my.database.model.Table1</class>
.
.
.
<class>my.database.model.TableN</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="validation-mode" value="NONE"/>
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="openjpa.DynamicEnhancementAgent" value="false"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
</properties>
</persistence-unit>
</persistence>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="my_persistence_unit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>my_persistence_unit</jta-data-source>
<class>my.database.model.Table1</class>
.
.
.
<class>my.database.model.TableN</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="validation-mode" value="NONE"/>
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="openjpa.DynamicEnhancementAgent" value="false"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
</properties>
</persistence-unit>
</persistence>
my.interfaces.PersistenceStoreManager接口类
/*
*
*/
package my.interfaces;
import javax.persistence.EntityManager;
/**
* This class is responsible for managing the persistence store.
*
*
*/
public interface PersistenceStoreManager {
/**
* This method is called to establish the connection with the persistence
* storage
*/
public void setConnection();
/**
* This method gives the instance of the entity manager that would
* fetch/persist(add new data)/merge(update existing data). This method
* should always return an active transaction or begin a new transaction
*
* @return entity manager
*/
public EntityManager getEntityManager();
/**
* This method is called to close the existing connection.
*/
public void closeConnection();
/**
* This method is called to commit the transaction , clear the persistence
* context and then close the existing connection.
*/
public void commitAndCloseConnection();
}
我的Glassfish服务器是通过以下配置启动的:
INFO: JVM invocation command line:
-XX:+UnlockDiagnosticVMOptions
-XX:PermSize=64m
-XX:MaxPermSize=192m
-XX:NewRatio=2
-Xmx512m
-client
-javaagent:/opt/glassfish3/glassfish/lib/monitor/flashlight-agent.jar
-Dosgi.shell.telnet.maxconn=1
-Dfelix.fileinstall.disableConfigSave=false
-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver
-Dfelix.fileinstall.dir=/opt/glassfish3/glassfish/modules/autostart/
-Djavax.net.ssl.keyStore=/opt/glassfish3/glassfish/domains/MyDomain/config/keystore.jks
-Dosgi.shell.telnet.port=6666
-Djava.security.policy=/opt/glassfish3/glassfish/domains/MyDomain/config/server.policy
-Djava.awt.headless=true
-Dfelix.fileinstall.log.level=2
-Dfelix.fileinstall.poll=5000
-Dcom.sun.aas.instanceRoot=/opt/glassfish3/glassfish/domains/MyDomain
-Dosgi.shell.telnet.ip=127.0.0.1
-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory
-Djava.endorsed.dirs=/opt/glassfish3/glassfish/modules/endorsed:/opt/glassfish3/glassfish/lib/endorsed
-Dcom.sun.aas.installRoot=/opt/glassfish3/glassfish
-Dfelix.fileinstall.bundles.startTransient=true
-Djava.ext.dirs=/opt/java/lib/ext:/opt/java/jre/lib/ext:/opt/glassfish3/glassfish/domains/MyDomain/lib/ext
-Dfelix.fileinstall.bundles.new.start=true
-Djavax.net.ssl.trustStore=/opt/glassfish3/glassfish/domains/MyDomain/config/cacerts.jks
-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as
-Djava.security.auth.login.config=/opt/glassfish3/glassfish/domains/MyDomain/config/login.conf
-DANTLR_USE_DIRECT_CLASS_LOADING=true
-Dgosh.args=--nointeractive
尽管您提出了最初的问题,但在使用
JTA
(如persistence.xml
中所示)时,您不需要也不应该在PersistenceStoreManagerImpl
中手动管理事务
应使用与此示例类似的方法:
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class FileDAO {
@PersistenceContext
private EntityManager em;
public void store(File file) {
em.persist(file);
}
}
这几乎就是你所需要的。您可以在另一个类中使用它,方法是向它注入@EJB
注释
这并不需要类javax.persistence.persistence
,而是需要来自同一个包的其他类:)
如果您指定事务类型<代码> JTA<代码>,并且您想手动管理<代码> EntItMeals,有一些要考虑的事项在
中得到了很好的解释。在我看来,
JTA
应该是首选的事务类型,如果您使用能够提供JTA
的应用服务器和JDBC驱动程序(您可能有)。正如您在示例中看到的,它使许多代码过时。它也不太容易出错。请添加PersistenceStoreManagerImpl
的代码。我猜eclipselink
groupID是某种类型的输入错误,因为它应该是org.eclipse.persistence
。我已经添加了这些类。eclipselink
groupId不是打字错误;父POM指示maven从我们维护的repo中提取库。但我不认为这是一个问题,因为javax.persistence模块仍然在Glassfish服务器上。四处寻找解决方法让我更加确信,[as install]/modules/
目录是关键。对这个问题的回答可能有助于阐明这一点。感谢您的代码和建议。我将尝试实现它们,并看看如何进行。不过,我还是希望能找到我原来问题的答案。
/**
*
*/
package my.database.manager;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import my.database.interfaces.PersistenceStoreManager;
/**
* This class is responsible for providing the entity manager that will manage
* the entity instances and their life cycles.This class should implement the
* PersistenceStoreManager interfaces
*
*/
public class PersistenceStoreManagerImpl implements PersistenceStoreManager
{
/**
* This is the default database name which is used for accessing the database.
* This must match the persistence.xml value
*/
private static final String DATABASE_NAME = "my_persistence_unit";
private static EntityManagerFactory EMF = null;
/**
* This variable is associated with the persistence context. This variable
* is used to create and remove persistent entity instances, to find
* entities by their primary key, and to query over entities.
*/
private EntityManager em;
/**
* This is the instance of the class and should always be fetched by
* getInstance() method
*/
private static PersistenceStoreManagerImpl instance;
/**
* This is the default constructor of the class, this is made private so
* that the instance can be created through getInstance()
*/
private PersistenceStoreManagerImpl() {
}
/**
* Creates the EntityManagerFactory from the supplied database name.
* This must be done before getInstance() is called.
*
* @param databaseName
*/
public static void init(String databaseName)
{
EMF = Persistence.createEntityManagerFactory(databaseName);
System.out.println("PersistenceStoreManager initialised to use database " + databaseName);
}
/*
* Returns the singleton instance.
* If the class has not yet been initialised, it will be initialised with the default database name
*
* @returns the singleton instance or null if it has not been initialised.
*/
public static PersistenceStoreManager getInstance()
{
if (null == instance)
{
// If the database name has not been set, use the default one
if (EMF == null)
{
init(DATABASE_NAME);
}
instance = new PersistenceStoreManagerImpl();
}
return instance;
}
/*
* (non-Javadoc)
*
* @see my.interfaces.PersistenceStoreManager#setConnection()
*/
@Override
public void setConnection() {
this.em = EMF.createEntityManager();
}
/*
* (non-Javadoc)
*
* @see my.interfaces.PersistenceStoreManager#
* getEntityManagerForTransaction()
*/
@Override
public EntityManager getEntityManager() {
setConnection();
if (!em.getTransaction().isActive()) {
em.getTransaction().begin();
}
return em;
}
/*
* (non-Javadoc)
*
* @see
* my.interfaces.PersistenceStoreManager#commitAndCloseConnection
* ()
*/
@Override
public void commitAndCloseConnection() {
em.getTransaction().commit();
em.clear();
em.close();
}
/*
* (non-Javadoc)
*
* @see
* my.interfaces.PersistenceStoreManager#closeConnection()
*/
@Override
public void closeConnection() {
em.close();
}
}
/*
*
*/
package my.interfaces;
import javax.persistence.EntityManager;
/**
* This class is responsible for managing the persistence store.
*
*
*/
public interface PersistenceStoreManager {
/**
* This method is called to establish the connection with the persistence
* storage
*/
public void setConnection();
/**
* This method gives the instance of the entity manager that would
* fetch/persist(add new data)/merge(update existing data). This method
* should always return an active transaction or begin a new transaction
*
* @return entity manager
*/
public EntityManager getEntityManager();
/**
* This method is called to close the existing connection.
*/
public void closeConnection();
/**
* This method is called to commit the transaction , clear the persistence
* context and then close the existing connection.
*/
public void commitAndCloseConnection();
}
INFO: JVM invocation command line:
-XX:+UnlockDiagnosticVMOptions
-XX:PermSize=64m
-XX:MaxPermSize=192m
-XX:NewRatio=2
-Xmx512m
-client
-javaagent:/opt/glassfish3/glassfish/lib/monitor/flashlight-agent.jar
-Dosgi.shell.telnet.maxconn=1
-Dfelix.fileinstall.disableConfigSave=false
-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver
-Dfelix.fileinstall.dir=/opt/glassfish3/glassfish/modules/autostart/
-Djavax.net.ssl.keyStore=/opt/glassfish3/glassfish/domains/MyDomain/config/keystore.jks
-Dosgi.shell.telnet.port=6666
-Djava.security.policy=/opt/glassfish3/glassfish/domains/MyDomain/config/server.policy
-Djava.awt.headless=true
-Dfelix.fileinstall.log.level=2
-Dfelix.fileinstall.poll=5000
-Dcom.sun.aas.instanceRoot=/opt/glassfish3/glassfish/domains/MyDomain
-Dosgi.shell.telnet.ip=127.0.0.1
-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory
-Djava.endorsed.dirs=/opt/glassfish3/glassfish/modules/endorsed:/opt/glassfish3/glassfish/lib/endorsed
-Dcom.sun.aas.installRoot=/opt/glassfish3/glassfish
-Dfelix.fileinstall.bundles.startTransient=true
-Djava.ext.dirs=/opt/java/lib/ext:/opt/java/jre/lib/ext:/opt/glassfish3/glassfish/domains/MyDomain/lib/ext
-Dfelix.fileinstall.bundles.new.start=true
-Djavax.net.ssl.trustStore=/opt/glassfish3/glassfish/domains/MyDomain/config/cacerts.jks
-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as
-Djava.security.auth.login.config=/opt/glassfish3/glassfish/domains/MyDomain/config/login.conf
-DANTLR_USE_DIRECT_CLASS_LOADING=true
-Dgosh.args=--nointeractive
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class FileDAO {
@PersistenceContext
private EntityManager em;
public void store(File file) {
em.persist(file);
}
}