【发布时间】:2016-11-03 11:54:43
【问题描述】:
众所周知,jsp 不能与当前 osgi web 归档包之外的类一起使用。这是GF中的一个错误。 glassfish 的开发人员为解决此错误https://java.net/jira/browse/GLASSFISH-11208 提供了使用离线 jsp 编译器(换句话说,不是在部署期间而是在存档构建期间编译 jsp 文件)。好的,我在 wab 构建期间使用 jspc-maven-plugin 来编译我的 jsp。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>1.4.6</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
<id>compile</id>
</execution>
</executions>
<configuration>
</configuration>
</plugin>
jsp 已编译,我在构建的 web 存档中看到了它们的 .classes。
现在的问题 - 我怎样才能让 glassfish 使用我编译的 jsp 而不是自己编译它?因为我看到 GF 会忽略已编译的 .classes 并生成 .javas 并自行编译。
编辑 1 我现在所做的: 1)我添加到 glassfish-web.xml
<jsp-config>
<property name="usePrecompiled" value="true"/>
<!-- to see it doesn't generate .javas -->
<property name="keepgenerated" value="true" />
</jsp-config>
2)当我构建我的 wab 存档时,我在 WEB-INF/classes/jsp/... 中有 jsp 类但是,我得到了找不到 jsp 文件的异常。当我 manually 将 jsp 类移动到 WEB-INF/classes/org/apache/jsp... 时,我看到容器现在可以看到这些类,但我得到了
StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
java.lang.NoClassDefFoundError: org/apache/jsp/... (wrong name: jsp/...)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925)
at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978)
at org.glassfish.osgijavaeebase.BundleClassLoader.loadClass(BundleClassLoader.java:79)
at org.glassfish.osgiweb.OSGiWebDeploymentContext$WABClassLoader.loadClass(OSGiWebDeploymentContext.java:169)
at org.glassfish.osgiweb.OSGiWebDeploymentContext$WABClassLoader.loadClass(OSGiWebDeploymentContext.java:154)
at org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:654)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:202)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:875)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:739)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:695)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:626)
所以知道这是正确的路径 - org/apache/jsp。问题是如何让maven插件输出到这个方向?
编辑 2 所以我找到了这个 maven 插件的设置 -
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>1.4.6</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
<id>compile</id>
<configuration>
<packageName>org.apache.jsp</packageName>
</configuration>
</execution>
</executions>
<configuration>
</configuration>
</plugin>
但是,这是最后一点,而不是结果。我也不例外,但是返回的 http 请求是空的(浏览器中的空白页面)。看来我应该使用另一个 maven 插件,但哪个?
【问题讨论】:
-
明确地说,您是在构建 WAB 应用程序而不是 WAR 应用程序,对吗?
-
@Steve C 请看我的编辑。
-
如果您不一定要使用 Glassfish 作为容器,Apache Karaf 提供了一个替代方案作为纯 OSGi 容器。与 Pax-Web 一起,它还支持 JSP
-
@Achim Nierbeck 但是没有 Pax-Web 没有 Apache Karaf 都不是完整的 JavaEE 服务器。
-
您缺少哪一部分?当然不是 EJB,尽管您可以使用那些具有开放 EJB (tomEE) 的 EJB
标签: java jsp jakarta-ee glassfish osgi