Create a Java Web Application using Embedded Tomcat (如何使用Embedded 创建一个基于Tomcat的Web 应用))

本文介绍如何从零开始使用嵌入式Tomcat构建简单的Java Web应用程序,并部署到Heroku平台。通过逐步指导,读者可以了解所需的依赖项、启动类设置及Servlet配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Table of Contents

This tutorial will show you how to create a simple Java web application using embedded Tomcat.

Follow each step to build an app from scratch, or skip to the end get the source for this article.

Sample code for the embedded Tomcat demo is available on GitHub.

Prerequisites

  • Basic Java knowledge, including an installed version of the JVM and Maven.
  • Basic Git knowledge, including an installed version of Git.

Create your pom.xml

Create a folder to hold your app and create a file called pom.xml in the root of that folder with the following contents:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.heroku.sample</groupId>
  <artifactId>embeddedTomcatSample</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>embeddedTomcatSample Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <tomcat.version>7.0.34</tomcat.version>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-juli</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper-el</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jsp-api</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>embeddedTomcatSample</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>launch.Main</mainClass>
                        <name>webapp</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>
</project>

This pom.xml defines the dependencies that you’ll need to run Tomcat in an embedded mode.

The last 3 entries are only required for applications that use JSP files. If you use this technique for an application that doesn’t use JSPs then you can just include the first 3 dependencies.

There is also a single plugin defined. The appassembler plugin generates a launch script that automatically sets up your classpath and calls your main method (created below) to launch your application.

Add a launcher class

Create a file called Main.java in your src/main/java/launch directory and put the following in it:

package launch;

import java.io.File;
import org.apache.catalina.startup.Tomcat;

public class Main {

    public static void main(String[] args) throws Exception {

        String webappDirLocation = "src/main/webapp/";
        Tomcat tomcat = new Tomcat();

        //The port that we should run on can be set into an environment variable
        //Look for that variable and default to 8080 if it isn't there.
        String webPort = System.getenv("PORT");
        if(webPort == null || webPort.isEmpty()) {
            webPort = "8080";
        }

        tomcat.setPort(Integer.valueOf(webPort));

        tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
        System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();  
    }
}

Add a Servlet

Create a file called HelloServlet.java in the src/main/java/servlet directory and put the following into it:

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
        name = "MyServlet", 
        urlPatterns = {"/hello"}
    )
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        ServletOutputStream out = resp.getOutputStream();
        out.write("hello heroku".getBytes());
        out.flush();
        out.close();
    }
    
}

This is simple Servlet that uses annotations to configure itself.

Add a JSP

Create a file called index.jsp in the src/main/webapp directory:

<html>
    <body>
        <h2>Hello Heroku!</h2>
    </body>
</html>

Run your application

To generate the start scripts simply run:

$ mvn package

And then simply run the script:

$ sh target/bin/webapp

That’s it. Your application should start up on port 8080. You can see the JSP at http://localhost:8080 and the servlet and http://localhost:8080/hello

Deploy your application to Heroku

Create a Procfile

You declare how you want your application executed in Procfile in the project root. Create this file with a single line:

web: sh target/bin/webapp

Learn more about procfile.

Optionally Choose a JDK

By default, OpenJDK 1.6 is installed with your app. However, you can choose to use a newer JDK by specifying java.runtime.version=1.7 in thesystem.properties file.

Here’s what a system.properties file looks like:

java.runtime.version=1.7

You can specify 1.6, 1.7, or 1.8 (1.8 is in beta) for Java 6, 7, or 8 (with lambdas), respectively.

Deploy to Heroku

Commit your changes to Git:

$ git init
$ git add .
$ git commit -m "Ready to deploy"

Create the app:

$ heroku create
Creating high-lightning-129... done, stack is cedar
http://high-lightning-129.herokuapp.com/ | git@heroku.com:high-lightning-129.git
Git remote heroku added

Deploy your code:

$ git push heroku master
Counting objects: 227, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (117/117), done.
Writing objects: 100% (227/227), 101.06 KiB, done.
Total 227 (delta 99), reused 220 (delta 98)

-----> Heroku receiving push
-----> Java app detected
-----> Installing Maven 3.0.3..... done
-----> Installing settings.xml..... done
-----> executing .maven/bin/mvn -B -Duser.home=/tmp/build_1jems2so86ck4 -s .m2/settings.xml -DskipTests=true clean install
       [INFO] Scanning for projects...
       [INFO]                                                                         
       [INFO] ------------------------------------------------------------------------
       [INFO] Building petclinic 0.1.0.BUILD-SNAPSHOT
       [INFO] ------------------------------------------------------------------------
       ...
       [INFO] ------------------------------------------------------------------------
       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------------
       [INFO] Total time: 36.612s
       [INFO] Finished at: Tue Aug 30 04:03:02 UTC 2011
       [INFO] Final Memory: 19M/287M
       [INFO] ------------------------------------------------------------------------
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 62.7MB
-----> Launching... done, v5
       http://pure-window-800.herokuapp.com deployed to Heroku

Congratulations! Your web app should now be up and running on Heroku. Open it in your browser with:

:::term  
$ heroku open

This will show your your JSP and then you can navigate to /hello to see your servlet.

Clone the source

If you want to skip the creation steps you can clone the finished sample:

$ git clone git@github.com:heroku/devcenter-embedded-tomcat.git

Feedback

If this article is incorrect or outdated, or omits critical information, please let us know. For all other issues, please see our support channels.

java -jar travel-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.2.5.RELEASE) 2025-07-10 04:23:21.267 INFO 17016 --- [ main] com.cn.travel.TravelApplication : Starting TravelApplication v0.0.1-SNAPSHOT on kali with PID 17016 (/mnt/hgfs/shiyansucai/travel-0.0.1-SNAPSHOT.jar started by root in /mnt/hgfs/shiyansucai) 2025-07-10 04:23:21.271 DEBUG 17016 --- [ main] com.cn.travel.TravelApplication : Running with Spring Boot v2.2.5.RELEASE, Spring v5.2.4.RELEASE 2025-07-10 04:23:21.271 INFO 17016 --- [ main] com.cn.travel.TravelApplication : No active profile set, falling back to default profiles: default 2025-07-10 04:23:22.054 INFO 17016 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2025-07-10 04:23:22.088 INFO 17016 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 26ms. Found 0 JPA repository interfaces. 2025-07-10 04:23:22.203 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'orderDao' and 'com.cn.travel.cms.order.dao.OrderDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'insuranceDao' and 'com.cn.travel.cms.insurance.dao.InsuranceDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'scenicSpotDao' and 'com.cn.travel.cms.scenicSpot.dao.ScenicSpotDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'travelRouteDao' and 'com.cn.travel.cms.travelRoute.dao.TravelRouteDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'userDao' and 'com.cn.travel.role.user.dao.UserDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'carDao' and 'com.cn.travel.cms.car.dao.CarDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'strategyDao' and 'com.cn.travel.cms.strategy.dao.StrategyDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'adminDao' and 'com.cn.travel.role.admin.dao.AdminDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'messageDao' and 'com.cn.travel.cms.message.dao.MessageDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.204 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'hotelDao' and 'com.cn.travel.cms.hotel.dao.HotelDao' mapperInterface. Bean already defined with the same name! 2025-07-10 04:23:22.205 WARN 17016 --- [ main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.cn.travel.*.*.dao]' package. Please check your configuration. 2025-07-10 04:23:22.683 INFO 17016 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 80 (http) 2025-07-10 04:23:22.694 INFO 17016 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-07-10 04:23:22.694 INFO 17016 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.31] 2025-07-10 04:23:22.856 WARN 17016 --- [ main] o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [jar:file:/mnt/hgfs/shiyansucai/travel-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/spring-webmvc-5.2.4.RELEASE.jar!/] from classloader hierarchy java.io.IOException: Unable to open root Jar file 'war:file:/mnt/hgfs/shiyansucai/travel-0.0.1-SNAPSHOT.jar*/BOOT-INF/lib/spring-webmvc-5.2.4.RELEASE.jar' at org.springframework.boot.loader.jar.Handler.getRootJarFile(Handler.java:316) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.jar.Handler.getRootJarFileFromUrl(Handler.java:298) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.jar.Handler.openConnection(Handler.java:84) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at java.base/java.net.URL.openConnection(URL.java:1258) ~[na:na] at java.base/java.net.URL.openStream(URL.java:1325) ~[na:na] at org.apache.tomcat.util.descriptor.tld.TldResourcePath.openStream(TldResourcePath.java:127) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.descriptor.tld.TldParser.parse(TldParser.java:61) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.parseTld(TldScanner.java:279) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(TldScanner.java:313) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:387) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:318) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:270) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:233) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.startup.Tomcat.start(Tomcat.java:467) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:107) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:88) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:438) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:191) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at com.cn.travel.TravelApplication.main(TravelApplication.java:16) ~[classes!/:0.0.1-SNAPSHOT] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] Caused by: java.lang.IllegalStateException: Not a file URL at org.springframework.boot.loader.jar.Handler.getRootJarFile(Handler.java:304) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] ... 58 common frames omitted 2025-07-10 04:23:22.896 WARN 17016 --- [ main] o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [jar:file:/mnt/hgfs/shiyansucai/travel-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/jstl-1.2.jar!/] from classloader hierarchy java.io.IOException: Unable to open root Jar file 'war:file:/mnt/hgfs/shiyansucai/travel-0.0.1-SNAPSHOT.jar*/BOOT-INF/lib/jstl-1.2.jar' at org.springframework.boot.loader.jar.Handler.getRootJarFile(Handler.java:316) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.jar.Handler.getRootJarFileFromUrl(Handler.java:298) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.jar.Handler.openConnection(Handler.java:84) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at java.base/java.net.URL.openConnection(URL.java:1258) ~[na:na] at java.base/java.net.URL.openStream(URL.java:1325) ~[na:na] at org.apache.tomcat.util.descriptor.tld.TldResourcePath.openStream(TldResourcePath.java:127) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.descriptor.tld.TldParser.parse(TldParser.java:61) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.parseTld(TldScanner.java:279) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(TldScanner.java:313) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:387) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:318) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:270) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:233) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:83) ~[tomcat-embed-jasper-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.apache.catalina.startup.Tomcat.start(Tomcat.java:467) ~[tomcat-embed-core-9.0.31.jar!/:9.0.31] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:107) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:88) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:438) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:191) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at com.cn.travel.TravelApplication.main(TravelApplication.java:16) ~[classes!/:0.0.1-SNAPSHOT] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] Caused by: java.lang.IllegalStateException: Not a file URL at org.springframework.boot.loader.jar.Handler.getRootJarFile(Handler.java:304) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] ... 58 common frames omitted 2025-07-10 04:23:22.919 INFO 17016 --- [ main] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 2025-07-10 04:23:22.923 INFO 17016 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-07-10 04:23:22.923 INFO 17016 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1582 ms 2025-07-10 04:23:22.989 INFO 17016 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource 2025-07-10 04:23:23.198 INFO 17016 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 2025-07-10 04:23:23.431 INFO 17016 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2025-07-10 04:23:23.522 INFO 17016 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.12.Final 2025-07-10 04:23:23.668 INFO 17016 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final} 2025-07-10 04:23:23.771 INFO 17016 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect 2025-07-10 04:23:23.799 WARN 17016 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000341: Could not obtain connection metadata : Unknown column 'RESERVED' in 'WHERE' 2025-07-10 04:23:23.800 WARN 17016 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 2025-07-10 04:23:23.801 INFO 17016 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closing ... 2025-07-10 04:23:23.807 INFO 17016 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closed 2025-07-10 04:23:23.809 INFO 17016 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2025-07-10 04:23:23.830 INFO 17016 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2025-07-10 04:23:23.832 ERROR 17016 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108) ~[spring-context-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.5.RELEASE.jar!/:2.2.5.RELEASE] at com.cn.travel.TravelApplication.main(TravelApplication.java:16) ~[classes!/:0.0.1-SNAPSHOT] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[travel-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1202) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1233) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) ~[spring-orm-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.4.RELEASE.jar!/:5.2.4.RELEASE] ... 22 common frames omitted Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final] ... 39 common frames omitted
最新发布
07-11
<think>好的,我现在需要分析用户提供的Spring Boot应用启动日志,找出问题所在。首先,用户执行了java -jar命令运行travel-0.0.1-SNAPSHOT.jar,但应用启动失败。 看一下日志的开头部分,Spring Boot版本是2.2.5,Java版本可能是较新的,因为部分日志显示na:na。接下来,注意到有很多WARN级别的日志,关于MyBatis的MapperFactoryBean被跳过,提示Bean已经定义。这可能是因为多个地方扫描到了相同的DAO接口,导致重复定义,但可能只是警告,不影响启动。 然后,Tomcat初始化成功,端口80。但接下来出现两个IOException,扫描spring-webmvc-5.2.4.RELEASE.jar和jstl-1.2.jar时失败,提示“Unable to open root Jar file”,错误原因是“Not a file URL”。这可能与文件路径有关,特别是使用了hgfs挂载的目录,可能存在路径长度限制或特殊字符问题?例如,路径中的“war:file:/mnt/hgfs/...”可能格式不正确,导致无法正确解析JAR文件。 接下来,TldScanner报告没有找到TLDs,这可能是因为JSP相关的库无法加载,但如果是Spring Boot应用,通常不需要JSP,所以这个错误可能可以忽略。 关键的错误出现在Hibernate初始化部分:启动过程中出现BeanCreationException,无法创建entityManagerFactory。具体原因是org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set。这说明Hibernate无法确定数据库方言,可能是因为数据库连接配置不正确,导致无法获取数据库元数据来确定方言。 检查数据库配置,可能没有正确设置hibernate.dialect属性,或者数据库连接失败。例如,如果数据库服务未运行,或者连接URL、用户名、密码错误,就会导致无法连接数据库,进而无法确定方言。此外,日志中还有一条WARN:Could not obtain connection metadata : Unknown column 'RESERVED' in 'WHERE',这可能暗示数据库模式有问题,或者使用的Hibernate版本与数据库不兼容。 总结可能的问题点: 1. 数据库配置错误,导致无法连接数据库,无法确定方言。 2. hibernate.dialect未在配置中明确设置,依赖自动检测失败。 3. 路径问题导致某些JAR无法正确加载,虽然可能不影响核心功能,但可能引发其他问题。 4. MyBatis Mapper重复定义的警告,但可能不是主要原因。 用户需要检查application.properties或application.yml中的数据库配置,确保URL、用户名、密码正确,数据库服务正在运行,并且可以访问。另外,显式设置hibernate.dialect属性可能有助于解决方言问题。例如,如果是MySQL 8,应设置为org.hibernate.dialect.MySQL8Dialect。</think>从日志分析,应用启动失败的主要原因是 **Hibernate 无法确定数据库方言**,导致 `entityManagerFactory` 初始化失败。以下是关键问题及解决方案: --- ### **核心问题** 1. **Hibernate方言配置缺失** 日志中抛出异常: ``` Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set ``` 说明 Hibernate 无法自动检测数据库类型,且未在配置中显式指定 `hibernate.dialect`。 2. **数据库连接问题** 日志中出现警告: ``` Could not obtain connection metadata : Unknown column 'RESERVED' in 'WHERE' ``` 表明数据库连接异常,可能是数据库配置错误或数据库版本不兼容。 3. **JAR 文件扫描异常** Tomcat 扫描 `spring-webmvc` 和 `jstl` JAR 时失败,提示路径格式错误(`Not a file URL`)。这通常与文件路径包含特殊字符或挂载目录(如 `hgfs`)的兼容性问题有关。 --- ### **解决方案** #### 1. 显式配置 Hibernate 方言 在 `application.properties` 或 `application.yml` 中添加数据库方言配置。例如,若使用 MySQL 8,添加: ```properties spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect ``` #### 2. 检查数据库连接配置 验证数据库连接信息是否正确,包括: - **URL**:确保格式正确(如 `jdbc:mysql://localhost:3306/db_name`)。 - **用户名和密码**:检查是否匹配数据库账户权限。 - **驱动类名**:确认 `spring.datasource.driver-class-name` 正确(如 `com.mysql.cj.jdbc.Driver`)。 #### 3. 解决 JAR 路径扫描问题 日志中 `Failed to scan JAR` 警告可能由挂载目录(`hgfs`)的路径兼容性问题引起。尝试以下方法: - 将 JAR 文件复制到本地文件系统路径(如 `/tmp`),避免使用挂载目录。 - 升级 Spring Boot 版本至 2.3+(修复了部分路径处理问题)。 #### 4. 排除 MyBatis 冲突(可选) 日志中提示多个 MyBatis Mapper 被重复定义,可在 `application.properties` 中排除自动扫描: ```properties mybatis.mapper-locations=classpath*:mapper/**/*.xml ``` 或检查 DAO 接口的 `@Mapper` 注解是否正确使用。 --- ### **验证步骤** 1. 修改配置后重新启动应用: ```bash java -jar travel-0.0.1-SNAPSHOT.jar ``` 2. 观察日志是否仍有 Hibernate 异常或数据库连接错误。 3. 确认应用是否成功启动并监听 80 端口。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值