为什么这个 Oracle Java Web 应用程序教程似乎不再起作用?

问题描述 投票:0回答:1

我从事 Web 工作已经很长时间了,但我对 Java 很陌生,尤其是它在 Web 应用程序中的使用。因为我通过实践学得最好,所以我目前正在学习 Oracle 的过时的教程,因为它使用了我想在 Java 环境中更熟悉的技术。具体包括:

    Apache Tomcat(嵌入式)
  • Maven
  • 引导程序
  • JSP
我正在使用 Ubuntu (22.04),安装并运行 Apache Tomcat (7.0.57)(尽管我的最终目标是探索其嵌入式使用)、OpenJDK 21.05(尽管我也有可用的版本 8 和 17,并且可以根据测试需要在它们之间切换)和 Maven (3.9.9)。

教程

看起来很简单,我在创建各种文件并进行第一次运行测试之前没有遇到任何困难。但它不起作用(无法正常运行)。我想也许我犯了一些错误,所以我下载了完整的应用程序来看看它是否可以运行,但没有成功。这是我在所有情况下收到的错误消息。 bash> mvn exec:java -Dexec.mainClass="com.example.employees.Main" [INFO] Scanning for projects... [INFO] [INFO] ----------------< com.example.employees:employees-app >----------------- [INFO] Building employees-app Maven Webapp 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- exec:3.5.0:java (default-cli) @ employees-app --- Nov 21, 2024 5:56:12 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-bio-8080"] Nov 21, 2024 5:56:12 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Tomcat Nov 21, 2024 5:56:12 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.57 Nov 21, 2024 5:56:12 PM org.apache.catalina.loader.WebappLoader buildClassPath INFO: Unknown loader jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48 class jdk.internal.loader.ClassLoaders$AppClassLoader Nov 21, 2024 5:56:12 PM org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment INFO: No global web.xml found Nov 21, 2024 5:56:12 PM org.apache.catalina.core.ApplicationContext log INFO: Marking servlet jsp as unavailable Nov 21, 2024 5:56:12 PM org.apache.catalina.core.StandardContext loadOnStartup SEVERE: Servlet / threw load() exception java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:506) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:488) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5231) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5518) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Nov 21, 2024 5:56:12 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"]

即便如此,仍有一个服务器在端口 8080 上运行。我可以点击它并获取以下页面

Screenshot of page returned from localhost:8080 目前我对技术的了解还不够,无法知道哪里出了问题。我已经下载了其他 Web 应用程序,例如

this

,它们可以与我现有的工具链一起正常运行,因此我非常确定我的技术堆栈可以正常运行。我尝试了一些明显的事情,例如切换到 Java 8 或 17,得到了相同的结果(相同的错误)。在我看来,考虑到 Oracle 教程最初编写以来已经过去了很长时间,某些地方可能存在配置错误。自版本 8 以来,Java 及其环境发生了很大变化,但我没有足够的经验来有效地解决这个问题。如果有人能够发现问题所在并帮助我解决这个问题,我们将能够更新此 Oracle 教程,从而将其实用性扩展到像我一样最近尝试学习其中一些技术的人。

以下是重现我所做的事情的方法:

从 Oracle
    下载源代码
  1. 将其解压并放入
  2. employees-app
  3. 文件夹 奔跑
  4. mvn compile
  5. 奔跑
  6. mvn exec:java -Dexec.mainClass="com.example.employees.Main"
  7. 
    
  8. 无论使用哪个 java 版本,输出(错误)都是相同的(测试了 8、17 和 21)。我更倾向于让它在最新版本 (21) 上运行。另外,如果在编译时遇到任何字符编码错误,则表明大多数 java 源文件的标头中使用的版权 (c) 字符存在问题。只需删除它(或替换为“(c)”),它应该可以正常编译。

java maven jsp tomcat7 oracle
1个回答
0
投票

过时的依赖项或 API:随着 Java 库和 API 的发展,教程可能会变得过时。 Spring Boot 或 Jakarta EE 等现代 Java Web 框架已经取代了旧的实践。 弃用技术:Oracle 弃用了一些工具,例如 Java EE,现在是 Jakarta EE。 JSP/Servlet 等较旧的方法可能需要更新以实现兼容性。 服务器环境:本教程可能假设使用 GlassFish 或 Tomcat 等服务器,该服务器可能不再配置或与您的系统兼容。 Java 版本:本教程可能不会考虑 Java 版本的更改。例如,Java 9+ 引入了模块系统,这可能会影响旧的应用程序。 缺少资源或文件:本教程可能引用不再托管或不再可供下载的文件或库。 浏览器兼容性:如果应用程序使用 Java Applet 或过时的 Web 技术,现代浏览器可能会出于安全考虑而阻止它们。 配置问题:IDE、环境变量或服务器设置的不正确设置可能会导致问题。 解决方案: 检查更新:查找更新版本的教程或更新的实践。 使用现代工具:考虑将 Spring Boot 或 Jakarta EE 用于 Web 应用程序。 验证环境:确保您的 Java 版本、服务器和工具符合教程的要求。 查阅文档:访问 Oracle 或 Jakarta EE 的官方文档以获取当前指南。

© www.soinside.com 2019 - 2024. All rights reserved.