0

我正在处理一个遗留项目,其中包括 jetty-6.1.9.jar、jsp-2.1.jar、jsp-api-2.1.jar、servlet-api-2.5-6.1.9.jar 并在 JRE 1.7.0_03 下运行.

Jetty 服务器在 MyServer.java 的 main 方法中启动。它创建一个 WebAppContext 并调用 WebAppContext.setWar($webAppRoot) 其中 $webAppRoot 是一个目录的完整路径,该目录下是通常的 WEB-INF 结构。

所有应用程序类和相关 JAR 都在调用 MyServer.main 的类路径中指定,WEB-INF/lib 中没有 JAR,WEB-INF/class 中也没有类(是的,我知道这搞砸了)。html、javascript、css 和 JSP 文件位于 $webAppRoot 中。

Jetty 文档谈论JSP2.1支持表明 ant-1.6.5 是必需的依赖项。该项目不包括 ant,但 JSP 已编译并在您点击它们时工作。

当我将应用程序类文件移动到 WEB-INF/classes 并将它们的依赖 JAR 移动到 WEB-INF/lib 时,Jetty 会抛出一个找不到类的错误,说当我点击其中一个 JSP 时它找不到与 ANT 相关的类。为什么在原始配置中没有 ANT 的 JSP 编译,但是当我将东西移动到 WEB-INF 时,需要 ANT?

4

1 回答 1

2

你从哪里得到那些 jsp 罐子?

JSP 是一种疯狂的技术,它拥有比厨房抽屉更多的叉子……我最近提倡我们对它进行分叉,因为我们使用的那个似乎已经死了(jsp.java.net 上的那个),我们需要一个合理的路径来获取更新一个 IP 可接受的 jsp 进入码头。无论如何,我离题了,目前我们在jetty 7、8和9中拥有的jsp版本默认行为是使用系统编译器,如果设置了某个属性(org.apache.jasper.compiler.disablejsr199=true)那么它而是查找我们当前分发的 eclipse 编译器或之后的 ant 编译器。所以...这种行为完全取决于您正在使用的 jsp 实现。如果您的类路径中没有 ant 并且正在编译 jsps,那么很可能它是由系统编译器完成的。

另外,我知道您正在处理一个遗留项目,但确实建议您更新到最新且受支持的 jetty 版本。并且除非更新到码头 6.1.26,否则会被推荐,因为在 6.1.9 和最后一个维护版本之间修复了很多东西。除此之外,如果您遇到 jsp 问题,那么仅从 6.1.26 发行版更新 jsp jar 可能有助于解决这个问题。您可能只需要打开这些 jsp jar 的源代码(我相信它位于 maven Central 的 org/mortbay/jetty 下)。

最后,自从我接触jetty 6以来已经有好几年了,也许您需要将ant放入webapp类加载器中,并且它以前可以工作,因为它在系统类加载器中?如果它在 $jetty.home/lib 下,那么也许 webapp 上下文被配置为在 webapp 类加载器中使用父优先级并从那里拉出 ant?

[编辑] 我注意到 6.1.9 有一个 maven-jetty-jspc-plugin 所以你可能应该只预编译你的 jsps 并完成它。(http://repo2.maven.org/maven2/org/mortbay/jetty/maven-jetty-jspc-plugin/

于 2013-03-08T19:47:44.280 回答