Ros*_*McC 5 java jstl embedded-jetty maven
我正在使用
当我在Eclipse中运行我的应用程序并浏览到包含JSTL标记的网页时,它可以正常工作.当我将它捆绑在一个可执行的jar中并从cmd提示符运行时,我得到了
org.apache.jasper.JasperException:/jsp/pcReport.jsp(4,62)PWC6188:绝对的uri:http://java.sun.com/jsp/jstl/core无法在web.xml或者使用此应用程序部署的jar文件
我的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>com.pricemon.server.Main</mainClass>
<classpathPrefix>webapp/WEB-INF/lib/</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Class-Path>etc/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我在我的Manifest类路径下的WEB-INF/lib下有我的JSTL jar
我只是无法弄清楚为什么这在eclipse下运行时有效但从可执行jar运行时不会工作.我也尝试在启动时手动添加到classpath而不起作用
java -classpath ./jstl-1.2.jar -jar app.jar
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西!?
我遇到了同样的问题,但最近没有找到答案.我不得不调试glassfish代码来解决它.我希望以下解释可以帮助其他人.
关于依赖关系,要使用带有glassfish的JSP运行,您将需要:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.2.3.v20140905</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-jsp-jdt</artifactId>
<version>2.3.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
即使你有一罐JSLT 1.2(可能javax.servlet.jsp.jstl.jar来自glassfish),你的嵌入式Jetty无法加载核心的原因是因为TldScanner类包括用于JSP的glassfish jar.要清楚这个类有一些静态的:
197 static {
198 systemUrisJsf.add("http://java.sun.com/jsf/core");
199 systemUrisJsf.add("http://java.sun.com/jsf/html");
200 systemUris.add("http://java.sun.com/jsp/jstl/core");
201 }
Run Code Online (Sandbox Code Playgroud)
并且由于阻塞,它不会在JAR中加载TLD
515 private void mapTldLocation(String resourcePath, TldInfo tldInfo,
516 boolean isLocal) {
517
518 String uri = tldInfo.getUri();
519 if (uri == null) {
520 return;
521 }
522
523 if ((isLocal
524 // Local tld files override the tlds in the jar files,
525 // unless it is in a system jar (except when using myfaces)
526 && mappings.get(uri) == null
527 && !systemUris.contains(uri)
528 && (!systemUrisJsf.contains(uri) || useMyFaces)
529 ) ||
530 (!isLocal
531 // Jars are scanned bottom up, so jars in WEB-INF override
532 // thos in the system (except when using myfaces)
533 && (mappings.get(uri) == null
534 || systemUris.contains(uri)
535 || (systemUrisJsf.contains(uri) && !useMyFaces)
536 )
537 )
538 ) {
...
Run Code Online (Sandbox Code Playgroud)
如果网址为" http://java.sun.com/jsp/jstl/core "并且存储在本地jar中,则无法加载您的TLD .要使它不是LOCAL,应用程序必须由父类包含JSTL jar的类加载器加载.简而言之,您需要修改代码以初始化WebAppContext为:
...
WebAppContext webapp = new WebAppContext();
// classURLs may contains URL to WEB-INF/classes or WEB-INF/lib/additional_jar of you web app
URLClassLoader classLoader = new URLClassLoader(classURLs.toArray(new URL[classURLs.size()]),
Thread.currentThread().getContextClassLoader());
webapp.setClassLoader(classLoader);
...
ContextHandlerCollection contextCollection = new ContextHandlerCollection();
contextCollection.addHandler(webapp);
...
Server server = new Server(threadPool);
server.setHandler(contextCollection);
server.start();
...
Run Code Online (Sandbox Code Playgroud)
如果这没有帮助,我想了解如何在您的应用程序中嵌入Jetty.
您的 JSTL 存在冲突/重复的工件。
简化您的依赖关系。
<dependencies>
<!-- Meta Dependency - adds JSP support to the same version of Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.0.6.v20130930</version>
</dependency>
<!-- NOT NEEDED
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jsp-2.1-glassfish</artifactId>
<version>2.1.v20100127</version>
</dependency> -->
</dependency>
Run Code Online (Sandbox Code Playgroud)
您可以看到我们没有使用 JSTL 工件和 org.mortbay.jetty 提供的 jsp 支持级别。
Jetty 提供了一个元依赖项来拉入工件,以在与您的 jetty-webapp 工件相同的 Jetty 版本上支持 JSP。