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);
    }
}