2016-07-01 26 views
0

jspは現在のosgi Webアーカイブバンドル以外のクラスでは動作しないことを誰もが知っています。これはGFのバグです。このバグを回避するためのglassfishの開発者https://java.net/jira/browse/GLASSFISH-11208は、オフラインjspコンパイラを使用することを提案しています(展開時ではなくアーカイブ構築時にjspファイルをコンパイルする)。 OK、私はwab構築中にjspをコンパイルするためにjspc-maven-pluginを使用しました。Glassfish 4.1.1およびオフラインJSPコンパイラ(JSPおよびOSGI)

<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アーカイブにそのクラスが表示されます。

問題があります。グラスフィッシュに私のコンパイル済みJSPを使用させることはできますが、コンパイルすることはできません。 GFはコンパイルされた.classesを無視して.javasを生成し、コンパイルします。

EDIT私が今までに作るもの1: 1)私は)

<jsp-config> 
     <property name="usePrecompiled" value="true"/> 
     <!-- to see it doesn't generate .javas --> 
     <property name="keepgenerated" value="true" /> 
    </jsp-config> 

2-web.xmlのをGlassFishのに加えて、私は私のWABアーカイブを構築するとき、私は、しかしWEB-INF/classes/jsp/...でJSPのクラスを持っていますjspファイルが見つからないという例外が出ます。私はWEB-INF/classes/org/apache/jsp...にJSPのクラスを移動manuallyとき、私は、コンテナは今、これらのクラスを見ていることがわかりますが、私は

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。問題は、この方向に出力するためのプラグインを作成する方法です。しかし、これが最後のポイントですが、結果ではない

<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> 

から2

EDITは、だから私はこのMavenプラグインの設定を発見しました。私も例外はありませんが、返されたhttpリクエストは空です(ブラウザの空白ページ)。他のMavenプラグインを使うはずですが、どちらを使うべきですか?

+0

明確にするには、WARアプリケーションではなくWABアプリケーションを構築していることは間違いありません。 –

+0

@ Steve C私の編集をご覧ください。 –

+0

GlassFishをコンテナとして使用することに縛られていない場合、Apache Karafは純粋なOSGiコンテナとして代替を提供します。また、Pax-Webと一緒にJSPをサポートします。 –

答えて

1

私が編集したすべてのステップで、web.xmlファイルを変更する必要があります。これは、プラグインが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> 
     <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> 

EDIT 最後に、私はGlassFishの4.1の碧玉のバージョンが知られていない、あるいは変更することができることを発見した - >私は、このような方法が見つからないという例外を得たなどだから私は次のように終わりました - このプラグインのソースをドローロードし、グラスフィッシュでジャスパーのバージョンを使用させました。私はプラグインのソースコードを変更しませんでしたが、pom.xmlのみでした。だから、最終的にポンポンとなった:

<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>[email protected]</email> 
      <organization>Savoir Technologies</organization> 
      <organizationUrl>http://www.savoirtech.com</organizationUrl> 
      <timezone>-7</timezone> 
     </developer> 
    </developers> 
    <contributors> 
     <contributor> 
      <name>Grzegorz Slowikowski</name> 
      <email>[email protected]</email> 
      <organization>Scott Tiger S.A.</organization> 
      <organizationUrl>http://www.tiger.com.pl</organizationUrl> 
      <timezone>+1</timezone> 
     </contributor> 
     <contributor> 
      <name>Pawel Pastula</name> 
      <email>[email protected]</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ファイルを使用できますが、その前にいくつかのことを行う必要があります。そしてあなたが見るように、コードをGFにリンクします。

jspの他のosgiバンドルのクラスで作業することができます。 java-eeでosgiを扱う人にとっては、これは非常に重要なことです。これらすべてのステップを実行した後は、開発者からの提案にもかかわらず、GF IS NOT SUPPORTED TO BE USED WITH PRECOMPILED JPS FILESと結論づけなければなりません。

GFでプリコンパイルされたjpsページを使用する方法はインターネットで最初に説明されているようですので、少なくとも1つはすべての解決策に感謝します。ところで、osgiを使用している場合、クラスが必要なパッケージをインポートできないという不満があります。

関連する問題