过去几个小时我一直在努力将动态网络模块项目部署到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 fyi:
<?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编译包,它可以正常工作,我可以将它正确地部署到远程glassfish 4服务器,因此Eclipse和Maven之间的某些东西必须不同步。
在这些情况下调试真的很难,你能指导我如何解决这个问题吗?
谢谢!
答案 0 :(得分:0)
据我所知,eclipse有自己的java编译器,它与Maven在命令行上执行Maven时使用的标准java编译器不同。
因此我建议您检查项目设置并将其与命令行java环境进行比较。
您可以输入mvn -v
来获取Maven使用的java主页和版本信息,其中包含以下内容:
Apache Maven 3.5.0
Maven home: c:\Dev\apache-maven-3.5.0\bin\..
Java version: 1.8.0_141, vendor: Oracle Corporation
Java home: c:\Program Files\Java\jdk1.8.0_141\jre
Default locale: de_CH, platform encoding: Cp1252
在Eclipse中,您可以将此信息与项目设置进行比较。