一、背景

最近在写一个MQ框架-gmq,先写的服务端,然后写客户端。感觉服务端和客户端分成两个独立的项目不合适,于是改成了maven父子模块的形式。父项目相当于一个壳,里面包含服务端、客户端两个模块。

二、问题描述

1、当时服务端是单独一个项目的时候,启动是正常的。pom配置如下:

<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.shuimutong</groupId>
<artifactId>gmq-server</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>gmq</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<gmvc.version>1.0.1-SNAPSHOT</gmvc.version>
<gdao.version>2.0.0-SNAPSHOT</gdao.version>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>me.lovegao</groupId>
<artifactId>gdao</artifactId>
<version>${gdao.version}</version>
</dependency>
<dependency>
<groupId>com.shuimutong</groupId>
<artifactId>gmvc</artifactId>
<version>${gmvc.version}</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
<build>
<finalName>com.shuimutong.gmq_server</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>

2、然后改成了父子模块的形式。

其中,父项目pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<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.shuimutong</groupId>
<artifactId>gmq</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>
<url>http://maven.apache.org</url> <modules>
<module>gmq-server</module>
<module>gmq-client</module>
</modules> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<global.version>0.0.1-SNAPSHOT</global.version>
<fastjson.version>1.2.60</fastjson.version>
<gdao.version>2.0.0-SNAPSHOT</gdao.version>
<gmvc.version>1.0.1-SNAPSHOT</gmvc.version>
<gutil.version>0.0.2-SNAPSHOT</gutil.version>
</properties> <dependencyManagement>
<dependencies>
<dependency>
<groupId>me.lovegao</groupId>
<artifactId>gdao</artifactId>
<version>${gdao.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.shuimutong</groupId>
<artifactId>gmvc</artifactId>
<version>${gmvc.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.shuimutong</groupId>
<artifactId>gutil</artifactId>
<version>${gutil.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>
</project>

GMQ服务端pom如下:

<?xml version="1.0"?>
<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>
<parent>
<groupId>com.shuimutong</groupId>
<artifactId>gmq</artifactId>
<version>${global.version}</version>
</parent>
<groupId>com.shuimutong</groupId>
<artifactId>gmq-server</artifactId>
<packaging>war</packaging>
<version>${global.version}</version>
<name>gmq-server</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>me.lovegao</groupId>
<artifactId>gdao</artifactId>
</dependency>
<dependency>
<groupId>com.shuimutong</groupId>
<artifactId>gmvc</artifactId>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
<build>
<finalName>com.shuimutong.gmq_server</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>
</project>

3、通过Eclipse部署到Tomcat启动,具体日志如下:

十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server.服务器版本: Apache Tomcat/9.0.14
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server.构建: Dec 6 2018 21:13:53 UTC
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server version number: 9.0.14.0
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS Name: Windows 10
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: OS.版本: 10.0
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: 结.造: amd64
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Java 环境变量: D:\develop\jdk1.8.0_144\jre
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM 版本: 1.8.0_144-b01
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: JVM.供应商: Oracle Corporation
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_BASE: E:\develop\work_space\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: CATALINA_HOME: D:\develop\apache-tomcat-9.0.14
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dcatalina.base=E:\develop\work_space\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dcatalina.home=D:\develop\apache-tomcat-9.0.14
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dwtp.deploy=E:\develop\work_space\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Djava.endorsed.dirs=D:\develop\apache-tomcat-9.0.14\endorsed
十一月 10, 2019 10:43:30 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dfile.encoding=UTF-8
十一月 10, 2019 10:43:30 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: Loaded APR based Apache Tomcat Native library [1.2.19] using APR version [1.6.5].
十一月 10, 2019 10:43:30 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
十一月 10, 2019 10:43:30 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
十一月 10, 2019 10:43:30 上午 org.apache.catalina.core.AprLifecycleListener initializeSSL
信息: OpenSSL successfully initialized [OpenSSL 1.1.1a 20 Nov 2018]
十一月 10, 2019 10:43:30 上午 org.apache.coyote.AbstractProtocol init
信息: 初始化协议处理器 ["http-nio-8080"]
十一月 10, 2019 10:43:31 上午 org.apache.coyote.AbstractProtocol init
信息: 初始化协议处理器 ["ajp-nio-8009"]
十一月 10, 2019 10:43:31 上午 org.apache.catalina.startup.Catalina load
信息: 服务器在[813]毫秒内初始化
十一月 10, 2019 10:43:31 上午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Catalina]
十一月 10, 2019 10:43:31 上午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet engine: [Apache Tomcat/9.0.14]
十一月 10, 2019 10:43:32 上午 org.apache.jasper.servlet.TldScanner scanJars
信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
十一月 10, 2019 10:43:34 上午 org.apache.jasper.servlet.TldScanner scanJars
信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
十一月 10, 2019 10:43:34 上午 org.apache.catalina.core.ApplicationContext log
信息: Marking servlet [gmvc] as unavailable
十一月 10, 2019 10:43:34 上午 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet [gmvc] in web application [/com.shuimutong.gmq_server] threw load() exception
java.lang.ClassNotFoundException: com.shuimutong.gmvc.handler.XDispatcherServlet
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1343)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1173)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:540)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:521)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1031)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4849)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5165)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:637)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) 十一月 10, 2019 10:43:34 上午 org.apache.coyote.AbstractProtocol start
信息: 开始协议处理句柄["http-nio-8080"]
十一月 10, 2019 10:43:34 上午 org.apache.coyote.AbstractProtocol start
信息: 开始协议处理句柄["ajp-nio-8009"]
十一月 10, 2019 10:43:34 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in [3,492] milliseconds
十一月 10, 2019 10:43:37 上午 org.apache.catalina.core.StandardServer await
信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
十一月 10, 2019 10:43:37 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["http-nio-8080"]
十一月 10, 2019 10:43:37 上午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["ajp-nio-8009"]
十一月 10, 2019 10:43:38 上午 org.apache.catalina.core.StandardService stopInternal
信息: Stopping service [Catalina]
十一月 10, 2019 10:43:38 上午 org.apache.coyote.AbstractProtocol stop
信息: Stopping ProtocolHandler ["http-nio-8080"]
十一月 10, 2019 10:43:38 上午 org.apache.coyote.AbstractProtocol stop
信息: Stopping ProtocolHandler ["ajp-nio-8009"]
十一月 10, 2019 10:43:38 上午 org.apache.coyote.AbstractProtocol destroy
信息: 正在摧毁协议处理器 ["http-nio-8080"]
十一月 10, 2019 10:43:38 上午 org.apache.coyote.AbstractProtocol destroy
信息: 正在摧毁协议处理器 ["ajp-nio-8009"]

简而言之,找不到gmvc的XDispatcherServlet类。(手写框架,写过的框架得用,所以就用了自己写的MVC框架)

反复install框架代码,无济于事。

某担心是gmvc框架的问题,于是部署了框架的测试代码,启动正常。

那么可以定位到,问题出在使用者身上。

三、解决问题之道

1、定位问题

想了又想,部署、重启了许多遍,无济于事。看网上有人说是Eclipse对maven支持不好,换IDEA,我差点换了。

看了好几遍项目结构,没有问题。

Marking servlet [gmvc] as unavailable

看着tomcat的启动日志,真想debug一下tomcat的代码,奈何做不到。

仔细想想,问题应该出在部署tomcat这个环节。

我打开部署项目到tomcat的路径:

E:\develop\work_space\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gmq-server

Eclipse的workspace里。。

看了项目的lib目录,只有一个jar:javax.servlet-api-3.1.0.jar

原来部署到tomcat里的时候,那些依赖的类没有部署过来。

2、解决问题

某百度了一下maven的scope,回想到以前项目里用provided,是因为其他模块已经包含了,打包时不需要再打入,我这里使用显然不合适。

我于是把父项目的scope全部去掉,但是依然不行。

最后看到了一篇文章(https://blog.csdn.net/u010295735/article/details/77504621),终于启动正常了。

文章整理的很到位,我这里就不再复述了,仅贴图一张,详情请参考原文。

----------------------下面是图----------------------

最新文章

  1. Loadrunner之API测试
  2. AppStore新应用上传指南
  3. 实验十五_安装新的int 9中断例程
  4. VS2015中添加新建项,找不到ado .net entity datamodel的解决方法
  5. 关于TCP/UDP缓存
  6. Hibernate逍遥游记-第15章处理并发问题-002悲观锁
  7. 从开发到部署会用到的 Docker 命令
  8. 访问vm中centos的web站点
  9. mysql的函数与储存过程与pymysql的配合使用
  10. Java基础5-接口
  11. jQuery懒加载插件 – jquery.lazyload.js简单调用
  12. MyEclipse 10 + OsChina GIt项目托管
  13. golang文件相对路径问题
  14. spring-AOP框架(基于配置文件的方式配置AOP)
  15. Java IO:同步、非堵塞式IO(NIO)
  16. Hbase总结(六)hbase37个笔试题
  17. Hign-Speed Tracking with Kernelzied Correlation Filters
  18. sql server 使用链接服务器连接Oracle,openquery查询数据
  19. Yii2:记一次尴尬的bug
  20. 第104天:web字体图标使用方法

热门文章

  1. gradle/gradle plugin/Android studio关系
  2. 一个按权重(weight)进行LB的算法
  3. Vscode 修改主题颜色
  4. 【MySQL】Mysql模糊查询like提速优化
  5. C#-DllImport 路径问题
  6. linux压缩 zip和unzip
  7. 平时没有怎么用Excel做 加减乘除 计算,猛地发现,其实Excel 是一个很好的简单计算器
  8. android 8.1 wifi提示&quot;已连接 但无法访问互联网&quot;的解决办法
  9. Python统计数据库中的数据量【含MySQL、Oracle】
  10. ubuntu解决网络连接的优先级