【发布时间】:2018-01-17 09:12:47
【问题描述】:
在过去的几个小时里,我在尝试将动态 Web 模块项目部署到 2 台不同的 Glassfish 4 服务器时遇到了麻烦,一台安装在本地,一台托管在网上。
即使添加了网页,该项目也运行良好(pom.xml 和 web.xml 都取自以前的项目 - 这些都没有问题),直到我只在一个类中为 DAO 添加了 EJB 注释。这是有问题的课程:
import java.util.ArrayList;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import be.helha.groupeA3.entities.Nouvelle;
@Stateless
@LocalBean
public class DAONouvelle {
@PersistenceContext(unitName="groupeA3JTA")
private EntityManager em;
public DAONouvelle() {}
public List<Nouvelle> getAllNouvelles() {
Query q = em.createQuery("SELECT n FROM Nouvelle n");
return new ArrayList<Nouvelle>(q.getResultList());
}
public Nouvelle getNouvelle(Nouvelle n) {
Query q = em.createQuery("SELECT n FROM Nouvelle n WHERE id=:id");
q.setParameter("id", n.getId());
return (Nouvelle) q.getSingleResult();
}
public Nouvelle createNouvelle(Nouvelle n) {
em.persist(n);
return n;
}
public int deleteNouvelle(Nouvelle n) {
Query q = em.createQuery("DELETE FROM Nouvelle n WHERE n.id=:id");
q.setParameter("id", n.getId());
return q.executeUpdate();
}
public int updateNouvelle(Nouvelle n1, Nouvelle n2) {
Query q = em.createQuery("UPDATE Nouvelle n SET n.titre=:titre,n.description=:description,n.image=:image WHERE n.id=:id");
q.setParameter("id", n1.getId());
q.setParameter("titre", n2.getTitre());
q.setParameter("description", n2.getDescription());
q.setParameter("image", n2.getImage());
return q.executeUpdate();
}
}
我知道更新和删除语句可能是错误的,但这不是重点。 将此项目部署到 Glassfish 4 时,它抱怨无法部署该项目:
2018-01-17T09:45:29.685+0100|Grave: Exception while preparing the app
2018-01-17T09:45:29.685+0100|Grave: Exception during lifecycle processing
java.lang.RuntimeException: Unable to load the EJB module. DeploymentContext does not contain any EJB. Check the archive to ensure correct packaging for C:\payara41\glassfish\domains\domain1\eclipseApps\groupeA3.
If you use EJB component annotations to define the EJB, and an ejb or web deployment descriptor is also used, please make sure that the deployment descriptor references a Java EE 5 or higher version schema, and that the metadata-complete attribute is not set to true, so the component annotations can be processed as expected
at org.glassfish.ejb.startup.EjbDeployer.prepare(EjbDeployer.java:189)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:926)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:435)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:220)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:488)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:544)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:540)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:539)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:570)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:562)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:561)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1469)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:111)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1851)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1727)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
at org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:189)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:480)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
at java.lang.Thread.run(Thread.java:745)
我没有运气用谷歌搜索堆栈跟踪,检查了我的 web.xml 版本(3.1,在另一个项目上工作)。这是 web.xml 仅供参考:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>groupeA3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
persistence.xml 也存在于 META-INF 文件夹中,用于另一个项目(使用 JTA)。
现在,通过运行一个 maven clean compile 包,它工作得很好,我可以将它正确部署到远程 glassfish 4 服务器,所以 Eclipse 和 Maven 之间一定是不同步的。
在这种情况下调试真的很困难,你能指导我如何解决这个问题吗?
谢谢!
【问题讨论】:
标签: eclipse maven jakarta-ee facelets glassfish-4