问题说明
本地开发测试,系统运行一切正常,但是系统打包部署到服务器之后,
浏览器控制台(Console)报错:
405 Method not allowed
,
后台日志报错:
org.springframework.web.servlet.PageNotFound - Request 'POST' not supported
解决路线
路线一:打包错误
从本地重新打包,放在服务器上运行,问题仍然存在,该路线不通;
-- 强制更新依赖
mvn clean package -Dmaven.test.skip=true -e -U
使用-U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
使用-e参数: 如果构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因。
路线二:Jar包冲突
1)通过工程中POM依赖树查看是否存在相同依赖,不通版本的jar包,不存在;
2)删除本地已存在的依赖包,重新从Maven私服拉取;
3)从服务器上查看是否存在tomcat-*.jar
以及servlet*.jar
,不存在;
上述三种方式做过后,再次打包测试,该路线不通;
知识点:Maven Scope作用域:
1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入
4、runtime在运行的时候依赖,在编译的时候不依赖
默认的依赖范围是compile
诸如:Junit、Powermock
等之类的作用域应是test
;servlet-api
以及tomcat-jul
之类的作用域是provided
,因为servlet-api
,tomcat
等web服务器已经存在了,如果再打包有可能会冲突。
路线三:运行环境与开发环境不一致
本地开发环境,JDK版本是1.8,运行环境JDK版本是1.7,将服务器上的JDK版本升级后发现查询功能可用但是导出功能不可用,问题便清晰了:
1)确认工程中配置的JDK编译版本是1.7
,本地工程无问题;
2)最近的一次改动变动引入了一个新的jar包:ngtool
3)修改ngtool工程中的jdk编译版本,由1.8
修改为1.7
:
<plugins>
<!-- 指定jdk -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
修改后重新编译发布:
mvn clean deploy -e -U
问题反思
- 本地开发环境下属于调试,运行正常后应在仿真环境下测试,保证一次编译,到处运行;
- 规范开发流程,开发环境与运行环境保持统一,减少类似上述这种低级问题的出现;
我是如何解决问题的
1.开启eclipse远程调试
1)在服务器上的进程启动参数中添加:
[test@localhost ~]$ cd $TOMCAT_HOME/bin
[test@localhost bin]$ vi catalina.sh
添加参数:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n"
2)启动Tomcat服务,查看服务端端口号状态,Telnet检查端口的连通性
3)调试客户端设置
选择Debug -> 设置 Debug configurations
--> Remote Java Application
输入Name -> 选择Project -> 输入Host地址 -> 输入上述设置的Port -> 点击Debug
打开应用,点击功能,和本地开发调试一样的操作,不多赘述。
额外释义:
-Xdebug是通知JVM工作在DEBUG模式下,
-Xrunjdwp是通知JVM使用(Java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项:transport指定了调试数据的传送方式 dt_socket 是指用SOCKET模式 server=y/n VM 是否需要作为调试服务器执行。 suspend=y/n 是否在调试客户端建立连接之后启动 VM
2. 打包工具统一:xxx_package.bat
@echo off
set JAVA_HOME=D:\java7\jdk1.7.0
set MAVEN_HOME=D:\maven3.3.3
set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
set PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jar\bin;%MAVEN_HOME%\bin
java -version
call mvn clean package -Dmaven.test.skip=true -e -U
pause
就一个想法,无论你本地有多少个JDK版本,一个项目组内统一使用同一个版本进行打包测试!