我正在使用
当我在Eclipse中运行我的应用程序并浏览到包含JSTL标记的网页时,它可以正常工作。当我将它捆绑在一个可执行的jar中并从cmd提示符运行时,我得到了
org.apache.jasper.JasperException:/jsp/pcReport.jsp(4,62)PWC6188:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:http://java.sun.com/jsp/jstl/core < / p>
我的依赖
<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>
我的插件
<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>
的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>
我的WEB-INF / lib下有我的JSTL jar,它位于我的Manifest类路径
我无法弄清楚为什么在eclipse下运行时这可行,但从可执行jar运行时不会工作。我还尝试在启动时手动添加到classpath
java -classpath ./jstl-1.2.jar -jar app.jar
我错过了一些明显的东西吗?
答案 0 :(得分:6)
我遇到了同样的问题,但最近没有找到答案。我不得不调试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>
即使你有一罐JSLT 1.2(来自glassfish的javax.servlet.jsp.jstl.jar
)你的嵌入式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 }
由于
中的阻塞,它不会在JAR中加载TLD515 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 ) {
...
如果网址为“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();
...
如果这没有帮助,我想了解你如何在你的应用程序中嵌入Jetty。
答案 1 :(得分:2)
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>
您可以看到我们不使用JSTL工件和org.mortbay.jetty提供的jsp支持级别。
Jetty提供了一个元依赖项来引入工件,以便在与Jetty-webapp工件相同的Jetty版本上支持JSP。
答案 2 :(得分:1)
您应该使用:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jstl</artifactId>
<version>${jetty-version}</version>
</dependency>
而不是:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
我也遇到了同样的问题,但是在我做出改变之后它就被吹了。