先看我的项目结构(项目是Spring+mybatis项目应用实战书中的14章项目改为maven 原项目下载)
项目结构
eclipse 中 文件结构
maven 配置
添加 依赖和 插件
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.28</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>8.5.28</version>
</dependency>
</dependencies>
<build>
<finalName>hrmSSM</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
tomcat启动类
参考了很多资料 但都是 加载servlet的 只有找到以下两个有加载项目的参考
https://www.jianshu.com/p/6bff04337753
https://blog.csdn.net/amaomao123/article/details/73179190
(高手可以参考 源码包里Tomcat7Runner类 但里面的设置实在太多了,看到头皮发麻)
我是参考上面两篇文章 然后一步步打印路径 测试这个两个都可以运行应用
tomcat 启动类直接放在Java包下就可以了 路径:D:\learn_workspace\hrmSSM\src\main\java\org\fkit\hrm\TomcatRun.java
启动时,eclipse直接右键 run
运行时还报一个找不到mchange-commons-java-0.2.3.4.jar的错误,把jar文件下载扔到对应的路径解决了
以下是上述两篇文章的启动类,我直接拿过来展示,改动不大。
package org.fkit.hrm;
import java.io.File;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
public class TomcatRun {
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));
String f1 = new File(webappDirLocation).getAbsolutePath();// D:\learn_workspace\hrmSSM\src\main\webapp
//System.out.println(f1);
StandardContext ctx = (StandardContext) tomcat.addWebapp("/",f1 );
// ctx.setDefaultContextXml("/D:/dev/tomcat/apache-tomcat-8.0.36/conf/web.xml");
// Declare an alternative location for your "WEB-INF/classes" dir
// Servlet 3.0 annotation will work
File additionWebInfClasses = new File("target/classes");
File webAppMount = new File("target/classes/WEB-INF/lib");
// "/D:/learn_workspace/hrmSSM/target/hrmSSM/WEB-INF/classes"
WebResourceRoot resources = new StandardRoot(ctx);
resources.addPreResources(
new DirResourceSet(resources, "/"+webAppMount.getAbsolutePath(),additionWebInfClasses.getAbsolutePath(), "/")
);
ctx.setResources(resources);
tomcat.start();
tomcat.getServer().await();
}
}
package org.fkit.hrm;
import java.io.File;
import javax.servlet.ServletException;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.AprLifecycleListener;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
/**
*
* @author Programming is an art from.
* @Description: TODO
*/
public class TomcatStart {
public static int TOMCAT_PORT = 8081;
public static String TOMCAT_HOSTNAME = "127.0.0.1";
public static String WEBAPP_PATH = "src/main/webapp";
public static String WEBINF_CLASSES = "/WEB-INF/classes";
public static String CLASS_PATH = "target/classes";
public static String INTERNAL_PATH = "/";
public static void main(String[] args) throws ServletException, LifecycleException {
TomcatStart.run();
}
public static void run() throws ServletException, LifecycleException {
Tomcat tomcat = new Tomcat();
tomcat.setPort(TomcatStart.TOMCAT_PORT);
tomcat.setHostname(TomcatStart.TOMCAT_HOSTNAME);
tomcat.setBaseDir("."); // tomcat 信息保存在项目下
/*
* https://www.cnblogs.com/ChenD/p/10061008.html
*/
StandardContext myCtx = (StandardContext) tomcat
.addWebapp("/hrmSSM", System.getProperty("user.dir") + File.separator + TomcatStart.WEBAPP_PATH);
/*
* true时:相关classes | jar 修改时,会重新加载资源,不过资源消耗很大
* autoDeploy 与这个很相似,tomcat自带的热部署不是特别可靠,效率也不高。生产环境不建议开启。
* 相关文档:
* http://www.blogjava.net/wangxinsh55/archive/2011/05/31/351449.html
*/
myCtx.setReloadable(false);
// 上下文监听器
myCtx.addLifecycleListener(new AprLifecycleListener());
String webAppMount = System.getProperty("user.dir") + File.separator + TomcatStart.CLASS_PATH;
WebResourceRoot root = new StandardRoot(myCtx);
root.addPreResources(
new DirResourceSet(root, TomcatStart.WEBINF_CLASSES, webAppMount, TomcatStart.INTERNAL_PATH));
tomcat.start();
tomcat.getServer().await();
}
}
有想尝试用的可以对应我的项目路径 试一下,希望对你有所帮助。感谢上述两篇文章的作者,完结散花。