嵌入式tomcat 加载项目

先看我的项目结构(项目是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();
    }
    
}

有想尝试用的可以对应我的项目路径 试一下,希望对你有所帮助。感谢上述两篇文章的作者,完结散花。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值