Glassfish 4.1.1 和离线 JSP 编译器(JSP 和 OSGI)
Glassfish 4.1.1 and offline JSP compiler (JSP and OSGI)
众所周知 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 已编译,我在内置网络存档中看到了它们的 .类。
现在的问题 - 如何让 glassfish 使用我编译的 jsp 而不是自己编译?因为我看到 GF 忽略了已编译的 .类 并生成 .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.access0(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 插件,但是哪个?
因此,对于我所做并在我的编辑中解释的所有步骤,有必要修改 web.xml 文件,因为插件将为从 jsp 页面生成的 servlet 添加映射。所以,最终的设置是:
<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>
<!-- package where the compiled jsp classes will be put -->
<packageName>org.apache.jsp</packageName>
<!-- the plugin adds servlets to this web.xml file -->
<outputWebXml>${project.build.directory}/web.xml</outputWebXml>
<verbose>true</verbose>
<target>8</target>
<source>8</source>
</configuration>
</execution>
</executions>
<configuration>
</configuration>
</plugin>
编辑
最后,我发现 GlassFish 4.1 中的 jasper 版本未知,甚至可以修改 -> 我遇到异常,找不到这种方法等。所以我以以下内容结束 - 我下载了这个插件的源代码并使用它glassfish 中 jasper 的版本。我没有对插件的源代码做任何修改,只在pom.xml。所以最后的pom变成了:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!--<parent>
<artifactId>mojo</artifactId>
<groupId>org.codehaus.mojo</groupId>
<version>11</version>
</parent>-->
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>1.4.6</version>
<packaging>maven-plugin</packaging>
<name>Maven Jspc plugin</name>
<developers>
<developer>
<name>Jeff Genender</name>
<email>jgenender@apache.org</email>
<organization>Savoir Technologies</organization>
<organizationUrl>http://www.savoirtech.com</organizationUrl>
<timezone>-7</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name>Grzegorz Slowikowski</name>
<email>gs@tiger.com.pl</email>
<organization>Scott Tiger S.A.</organization>
<organizationUrl>http://www.tiger.com.pl</organizationUrl>
<timezone>+1</timezone>
</contributor>
<contributor>
<name>Pawel Pastula</name>
<email>pablo@tiger.com.pl</email>
<organization>Scott Tiger S.A.</organization>
<organizationUrl>http://www.tiger.com.pl</organizationUrl>
<timezone>+1</timezone>
</contributor>
</contributors>
<dependencies>
<!-- from glassfish 4.1.1 modules folder we need:
javax.servlet.jsp.jar
javax.servlet-api.jar
javax.servlet.jsp-api.jar
javax.el.jar
javax.servlet.jsp.jstl-api.jar
javax.servlet.jsp.jstl.jar
what versions of this jar you can find out in parent pom of glassfish
http://repo.maven.apache.org/maven2/org/glassfish/main/glassfish-parent/4.1.1/glassfish-parent-4.1.1.pom
and in manifest file
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b01</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp</artifactId>
<version>2.3.3-b02</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
<!-- we need this dependency as it contais tld files for core tag library -->
<dependency>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>org.apache.jasper.glassfish</artifactId>
<version>2.2.2.v201112011158</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
编译捆绑包时,您必须添加以下依赖项:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp</artifactId>
<version>2.3.3-b02</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
此外,您还需要从 glassfish 导入一些包才能使其正常工作。因此,您可以在 glassfish 中使用预编译的 jps 文件,但您需要在此之前做一些事情。如您所见,link 您的代码给 GF。
最重要的是 - 您可以使用 jsp 中其他 osgi 包中的 类!对于那些在 java-ee 中使用 osgi 的人来说,这可能非常重要。完成所有这些步骤后,尽管开发人员提出了建议,但我必须得出结论 GF IS NOT SUPPORTED TO BE USED WITH PRECOMPILED JPS FILES
。
我希望至少有人会欣赏所有的解决方案,因为在我看来这是互联网上关于如何使用 GF 预编译 jps 页面的第一个描述。顺便说一下,如果你使用 osgi,它会抱怨找不到 类 导入必要的包。
众所周知 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 已编译,我在内置网络存档中看到了它们的 .类。
现在的问题 - 如何让 glassfish 使用我编译的 jsp 而不是自己编译?因为我看到 GF 忽略了已编译的 .类 并生成 .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.access0(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 插件,但是哪个?
因此,对于我所做并在我的编辑中解释的所有步骤,有必要修改 web.xml 文件,因为插件将为从 jsp 页面生成的 servlet 添加映射。所以,最终的设置是:
<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>
<!-- package where the compiled jsp classes will be put -->
<packageName>org.apache.jsp</packageName>
<!-- the plugin adds servlets to this web.xml file -->
<outputWebXml>${project.build.directory}/web.xml</outputWebXml>
<verbose>true</verbose>
<target>8</target>
<source>8</source>
</configuration>
</execution>
</executions>
<configuration>
</configuration>
</plugin>
编辑 最后,我发现 GlassFish 4.1 中的 jasper 版本未知,甚至可以修改 -> 我遇到异常,找不到这种方法等。所以我以以下内容结束 - 我下载了这个插件的源代码并使用它glassfish 中 jasper 的版本。我没有对插件的源代码做任何修改,只在pom.xml。所以最后的pom变成了:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!--<parent>
<artifactId>mojo</artifactId>
<groupId>org.codehaus.mojo</groupId>
<version>11</version>
</parent>-->
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>1.4.6</version>
<packaging>maven-plugin</packaging>
<name>Maven Jspc plugin</name>
<developers>
<developer>
<name>Jeff Genender</name>
<email>jgenender@apache.org</email>
<organization>Savoir Technologies</organization>
<organizationUrl>http://www.savoirtech.com</organizationUrl>
<timezone>-7</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name>Grzegorz Slowikowski</name>
<email>gs@tiger.com.pl</email>
<organization>Scott Tiger S.A.</organization>
<organizationUrl>http://www.tiger.com.pl</organizationUrl>
<timezone>+1</timezone>
</contributor>
<contributor>
<name>Pawel Pastula</name>
<email>pablo@tiger.com.pl</email>
<organization>Scott Tiger S.A.</organization>
<organizationUrl>http://www.tiger.com.pl</organizationUrl>
<timezone>+1</timezone>
</contributor>
</contributors>
<dependencies>
<!-- from glassfish 4.1.1 modules folder we need:
javax.servlet.jsp.jar
javax.servlet-api.jar
javax.servlet.jsp-api.jar
javax.el.jar
javax.servlet.jsp.jstl-api.jar
javax.servlet.jsp.jstl.jar
what versions of this jar you can find out in parent pom of glassfish
http://repo.maven.apache.org/maven2/org/glassfish/main/glassfish-parent/4.1.1/glassfish-parent-4.1.1.pom
and in manifest file
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b01</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp</artifactId>
<version>2.3.3-b02</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
<!-- we need this dependency as it contais tld files for core tag library -->
<dependency>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>org.apache.jasper.glassfish</artifactId>
<version>2.2.2.v201112011158</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
编译捆绑包时,您必须添加以下依赖项:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp</artifactId>
<version>2.3.3-b02</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
此外,您还需要从 glassfish 导入一些包才能使其正常工作。因此,您可以在 glassfish 中使用预编译的 jps 文件,但您需要在此之前做一些事情。如您所见,link 您的代码给 GF。
最重要的是 - 您可以使用 jsp 中其他 osgi 包中的 类!对于那些在 java-ee 中使用 osgi 的人来说,这可能非常重要。完成所有这些步骤后,尽管开发人员提出了建议,但我必须得出结论 GF IS NOT SUPPORTED TO BE USED WITH PRECOMPILED JPS FILES
。
我希望至少有人会欣赏所有的解决方案,因为在我看来这是互联网上关于如何使用 GF 预编译 jps 页面的第一个描述。顺便说一下,如果你使用 osgi,它会抱怨找不到 类 导入必要的包。