【发布时间】:2014-09-08 00:15:08
【问题描述】:
是否有一些特殊的方法可以确保 EJB 模块在 Netbeans 中正确部署到 Web 应用程序?
我来到EJB cookbook 示例,从servlet 调用会话Bean。我清除了 Netbeans 中的 glassfish 输出,进行了干净编译并运行:
INFO: visiting unvisited references
INFO: visiting unvisited references
SEVERE: Class [ Lpakt/Salutation; ] not found. Error while loading [ class pakt.SalutationServlet ]
INFO: visiting unvisited references
INFO: Loading application [SalutationApplication-war] at [/SalutationApplication-war]
INFO: SalutationApplication-war was successfully deployed in 382 milliseconds.
INFO: processRequest..
WARNING: StandardWrapperValve[SalutationServlet]: Servlet.service() for servlet SalutationServlet threw exception
java.lang.NoClassDefFoundError: pakt/Salutation
at pakt.SalutationServlet.processRequest(SalutationServlet.java:30)
at pakt.SalutationServlet.doGet(SalutationServlet.java:45)
为什么 servlet 没有加载 pakt.Salutation?
干净的结构(未编译):
SalutationApplication/
├── build.xml
├── nbproject
│ ├── ant-deploy.xml
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ └── private.properties
│ ├── project.properties
│ └── project.xml
├── SalutationApplication-ejb
│ ├── build.xml
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ └── private.properties
│ │ ├── project.properties
│ │ └── project.xml
│ └── src
│ ├── conf
│ │ └── MANIFEST.MF
│ └── java
│ └── pakt
│ ├── LocalBean.java
│ ├── RemoteBean.java
│ └── Salutation.java
├── SalutationApplication-war
│ ├── build.xml
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ └── private.properties
│ │ ├── project.properties
│ │ └── project.xml
│ ├── src
│ │ ├── conf
│ │ │ └── MANIFEST.MF
│ │ └── java
│ │ └── pakt
│ │ └── SalutationServlet.java
│ └── web
│ ├── index.html
│ └── WEB-INF
│ └── web.xml
└── src
└── conf
└── MANIFEST.MF
20 directories, 30 files
小服务程序:
package pakt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/SalutationServlet"})
public class SalutationServlet extends HttpServlet {
@EJB
private Salutation salutation;
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
System.out.println("processRequest..");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet SalutationServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>"
+ salutation.getFormalSalutation("Sherlock Holmes")
+ "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.flush();
out.close();
}
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
打包;
导入 javax.ejb.Stateless; 导入 javax.ejb.LocalBean;
@LocalBean @Stateless(mappedName = "salutationBean") 公共类 Salutation 实现 RemoteBean {
public String getFormalSalutation(String name) {
return "Dear " + name;
}
public String getInformalSalutation(String name) {
return "Hi " + name;
}
@Override
public void myRemote() {
System.out.println("myRemote..");
}
}
web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>SalutationServlet</servlet-name>
<servlet-class>pakt.SalutationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SalutationServlet</servlet-name>
<url-pattern>/SalutationServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
-------------------------------------------编辑--- --------------------------------
应用的其他结构:
thufir@dur:~$
thufir@dur:~$ tree NetBeansProjects/SalutationApplication
NetBeansProjects/SalutationApplication
├── build
│ ├── META-INF
│ │ └── MANIFEST.MF
│ ├── SalutationApplication-ejb.jar
│ └── SalutationApplication-war.war
├── build.xml
├── dist
│ └── SalutationApplication.ear
├── nbproject
│ ├── ant-deploy.xml
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ └── private.properties
│ ├── project.properties
│ └── project.xml
├── SalutationApplication-ejb
│ ├── build
│ │ ├── classes
│ │ │ ├── META-INF
│ │ │ │ └── MANIFEST.MF
│ │ │ └── pakt
│ │ │ ├── Salutation.class
│ │ │ └── SalutationLocal.class
│ │ ├── empty
│ │ └── generated-sources
│ │ └── ap-source-output
│ ├── build.xml
│ ├── dist
│ │ └── SalutationApplication-ejb.jar
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ └── private.properties
│ │ ├── project.properties
│ │ └── project.xml
│ └── src
│ ├── conf
│ │ └── MANIFEST.MF
│ └── java
│ └── pakt
│ ├── Salutation.java
│ └── SalutationLocal.java
├── SalutationApplication-war
│ ├── build
│ │ ├── empty
│ │ ├── generated-sources
│ │ │ └── ap-source-output
│ │ └── web
│ │ ├── index.html
│ │ ├── META-INF
│ │ │ └── MANIFEST.MF
│ │ └── WEB-INF
│ │ ├── classes
│ │ │ ├── pakt
│ │ │ └── servlet
│ │ │ └── SalutationServlet.class
│ │ └── web.xml
│ ├── build.xml
│ ├── dist
│ │ └── SalutationApplication-war.war
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ └── private.properties
│ │ ├── project.properties
│ │ └── project.xml
│ ├── src
│ │ ├── conf
│ │ │ └── MANIFEST.MF
│ │ └── java
│ │ ├── pakt
│ │ └── servlet
│ │ └── SalutationServlet.java
│ └── web
│ ├── index.html
│ └── WEB-INF
│ └── web.xml
└── src
└── conf
└── MANIFEST.MF
43 directories, 42 files
thufir@dur:~$
thufir@dur:~$ jar -tf NetBeansProjects/SalutationApplication/SalutationApplication-war/dist/SalutationApplication-war.war
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/pakt/
WEB-INF/classes/servlet/
WEB-INF/classes/servlet/SalutationServlet.class
WEB-INF/web.xml
index.html
thufir@dur:~$
thufir@dur:~$ jar -tf NetBeansProjects/SalutationApplication/SalutationApplication-ejb/dist/SalutationApplication-ejb.jar
META-INF/
META-INF/MANIFEST.MF
pakt/
pakt/Salutation.class
pakt/SalutationLocal.class
thufir@dur:~$
thufir@dur:~$
这就是应用程序的构建方式。
【问题讨论】:
-
在构建 WAR 存档后,SalutationApplication-war 的 WEB-INF/lib 目录中是否有 SalutationApplication-ejb jar?
-
@Ajan 我相信基于上述编辑的答案是“否”,其中包括目录树和 jar 结构。 但是
SalutationApplication-ejb确实 显示在SalutationApplication-war的库中(在netbeans 中),所以我不太确定。但是,它不会出现在实际生成的 .war 文件中。 -
Glassfish 报告成功部署令人沮丧
标签: servlets netbeans glassfish ejb stateless-session-bean