我从事 Web 工作已经很长时间了,但我对 Java 很陌生,尤其是它在 Web 应用程序中的使用。因为我通过实践学得最好,所以我目前正在学习 Oracle 的过时的教程,因为它使用了我想在 Java 环境中更熟悉的技术。具体包括:
教程
看起来很简单,我在创建各种文件并进行第一次运行测试之前没有遇到任何困难。但它不起作用(无法正常运行)。我想也许我犯了一些错误,所以我下载了完整的应用程序来看看它是否可以运行,但没有成功。这是我在所有情况下收到的错误消息。
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 上运行。我可以点击它并获取以下页面
目前我对技术的了解还不够,无法知道哪里出了问题。我已经下载了其他 Web 应用程序,例如
this,它们可以与我现有的工具链一起正常运行,因此我非常确定我的技术堆栈可以正常运行。我尝试了一些明显的事情,例如切换到 Java 8 或 17,得到了相同的结果(相同的错误)。在我看来,考虑到 Oracle 教程最初编写以来已经过去了很长时间,某些地方可能存在配置错误。自版本 8 以来,Java 及其环境发生了很大变化,但我没有足够的经验来有效地解决这个问题。如果有人能够发现问题所在并帮助我解决这个问题,我们将能够更新此 Oracle 教程,从而将其实用性扩展到像我一样最近尝试学习其中一些技术的人。
以下是重现我所做的事情的方法:从 Oracle
mvn compile
mvn exec:java -Dexec.mainClass="com.example.employees.Main"
过时的依赖项或 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 的官方文档以获取当前指南。