

プログラミング初心者です。独学でサーブレットを学んでいたところ、急にサーブレットファイルにエラーが発生するようになってしまったので投稿させてもらいます。

環境：  
Windows10  
vscodeを使用  
Tomcat10.0  
jdk-17.0.1

以下のようにPokemonServletに送信するだけのjspファイルがあります。

[code]

    <%@ page contentType="text/html;charset=UTF-8" %>
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>ポケモンダメージ計算ツール</title>
    </head>
    <body>
    <form method="POST" action ="PokemonServlet">
    
        <p><input type="submit" value="送信"></p>
        <input type="reset" value="取消">
    
    </form>
    
    </body>
    </html>
    
[/code]

以下PokemonServlet.javaファイルとなります。

[code]

    package to.msn.wings.selfjsp;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/PokemonServlet")
    public class PokemonServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();        
            out.println("<!DOCTYPE html><html><head><meta charset='UTF-8'>");
            out.println("<title>スクリプトレット</title>");
            out.println("</head><body>");
            for (int i = 0; i < 5; i++) {
            out.println("こんにちは、世界！<br>");
            }
            out.println("</body></html>");      
    
         }
    
        
    }
    
[/code]

jspファイルから送信ボタンを押すと次のようなエラーが発生します。

[code]

    jakarta.servlet.ServletException: サーブレットクラス [to.msn.wings.selfjsp.PokemonServlet] を初期化中のエラー
        org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
        org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
        org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:872)
        org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1705)
        org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        org.apache.tomcat.util.threads.TaskThread$WrappingR
    
    java.lang.UnsupportedClassVersionError: Preview features are not enabled for to/msn/wings/selfjsp/PokemonServlet (class file version 61.65535). Try running with '--enable-preview' （クラス[to.msn.wings.selfjsp.PokemonServlet]をロードできません）
        org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2521)
        org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:872)
        org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1408)
        org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1252)
        org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
        org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
        org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:872)
        org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1705)
        org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        java.base/java.lang.Thread.run(Thread.java:833)
    
[/code]

Tomcatのログを確認したところ上のエラーとどう関係しているのかわからないのですが以下のようなエラーが発生しているとありました。

[code]

    org.apache.catalina.util.LifecycleBase.handleSubClassException コンポーネント[Connector[HTTP/1.1-8080]] の初期化に失敗しました。
        org.apache.catalina.LifecycleException: プロトコルハンドラの初期化に失敗しました
            at org.apache.catalina.connector.Connector.initInternal(Connector.java:1055)
            at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
            at org.apache.catalina.core.StandardService.initInternal(StandardService.java:556)
            at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
            at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1042)
            at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
            at org.apache.catalina.startup.Catalina.load(Catalina.java:747)
            at org.apache.catalina.startup.Catalina.load(Catalina.java:769)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:568)
            at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:305)
            at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
        Caused by: java.net.BindException: Address already in use: bind
            at java.base/sun.nio.ch.Net.bind0(Native Method)
            at java.base/sun.nio.ch.Net.bind(Net.java:555)
            at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337)
            at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294)
            at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:244)
            at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:199)
            at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1184)
            at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1197)
            at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:580)
            at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:82)
            at org.apache.catalina.connector.Connector.initInternal(Connector.java:1052)
    
[/code]

具体的にどう修正すればいいのか困っています。情報が断片的で恐縮ですが、何かわかるかたいらっしゃいましたらよろしくお願いします。


CC BY-SA 4.0
2022-01-15T12:28:49.710
85712
2022-10-14T02:02:15.400
50908
question
java jsp servlet
サーブレットクラスを初期化中にエラーが発生する


`--enable-preview` オプションを付けてコンパイルしたものを、 `--enable-preview`
オプションを付けずに実行した場合に発生する例外です。

今回はプレビュー機能を必要としていないと思いますので、コンパイルオプションから `--enable-preview`
を除去すれば問題が解消すると思われます。

設定されているファイルは、どのプロジェクト構成ツールを使っているか(どうやって `.war` をビルドしているか)に依りますが、Maven, Gradle
を利用しているのであれば、次のような設定になっていると思いますので該当箇所を削除した上でコマンドパレットから **Java: Clean Java
Language Server Workspace** を実行してみてください。

  * [How can I use Visual Studio Code with new Java versions?](https://code.visualstudio.com/docs/java/java-faq#_how-can-i-use-visual-studio-code-with-new-java-versions)

(質問文にはこの辺りの情報がありませんので、もしMavenもGradleも利用していないのであれば、どのようにしてビルドを行っているのか質問文に追記してください)

逆に、プレビュー機能を有効化して実行したいのであれば、(上記の設定は残したまま) Tomcat 起動時の JVM オプションにも `--enable-
preview` を付与します。  
[Tomcat for Java
機能拡張](https://marketplace.visualstudio.com/items?itemName=adashen.vscode-
tomcat)を利用しているのであれば、 "TOMCAT SERVERS" パネルで対象の tomcat を右クリック > Customize JVM
Options を選択し、表示された設定ファイルに

[code]

    --enable-preview
    
[/code]

を追記することで実現できるようです。

* * *

なお、後半に書かれている例外は、使用中のポートを利用してサーバを起動しようとした(おそらく2重起動しようとした)ため発生しているものなので、別問題です。


CC BY-SA 4.0
2022-01-16T16:05:51.100
85739
2022-01-17T13:35:50.737
2022-01-17T13:35:50.737
2808
2808
85712
answer