接上篇:[MAVEN]maven最佳实践
maven风格的WEB程序怎样调试?
标准web目录结构
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/assembly | Assembly descriptors |
src/main/config | Configuration files |
src/main/scripts | Application/Library scripts |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt | Notices and attributions required by libraries that the project depends on |
README.txt | Project's readme |
web项目调试最佳实践
- 问题,jar都让maven管理了,web-inf/lib下没有jar了,这个时候怎样调试web呢?
-
原理:无论tomcat还是jetty作为web容器,最终启动他们的命令行都是:“java ....” 即他们都是标准的java应用程序启动方式,所以对于maven管理的web工程,手动添加jar到classpath即可了
编程方式使用tomcat调试maven war工程
- 定义tomcat配置文件:src/test/resources/tomcat.properties
catalina.home=/prog/apache/apache-tomcat-7.0.27-dev catalina.base=/workspace/com.talkyun.flex/Servers/dev-cloud-site
- TomcatStart.java启动代码:src/test/java/server/TomcatStart.java
package server; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; /** 启动tomcat */ public class TomcatStart { /** 设置tomcat启动需要的classpath、catalina.home和catalina.base设置 */ private static void setTomcatEnv(Properties tomcatConfig) throws ReflectiveOperationException, IOException { String catalinaHome = tomcatConfig.getProperty("catalina.home"); System.setProperty("catalina.home", catalinaHome); System.setProperty("catalina.base", tomcatConfig.getProperty("catalina.base", catalinaHome)); Path bootstrapJar = Paths.get(catalinaHome, "bin/bootstrap.jar"), tomcatJuliJar = bootstrapJar.resolveSibling("tomcat-juli.jar"); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); Method addURLMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); try { addURLMethod.setAccessible(true); addURLMethod.invoke(classloader, bootstrapJar.toUri().toURL()); addURLMethod.invoke(classloader, tomcatJuliJar.toUri().toURL()); try { classloader.loadClass("javax.servlet.ServletContainerInitializer"); } catch (ClassNotFoundException e) { addURLMethod.invoke(classloader, Paths.get(catalinaHome, "lib/servlet-api.jar").toUri().toURL()); } } finally { addURLMethod.setAccessible(false); } } /** 启动tomcat */ private static void start() throws ReflectiveOperationException { Class<?> bootstrapClazz = Class.forName("org.apache.catalina.startup.Bootstrap"); Method main = bootstrapClazz.getDeclaredMethod("main", String[].class); main.invoke(bootstrapClazz, (Object) new String[] {"start"}); } /** 请在 classpath:/tomcat.properties中设定: catalina.home, catalina.base(默认使用catalina.home) */ public static void main(String[] args) throws Exception { Properties tomcatConfig = new Properties(); tomcatConfig.load(TomcatStart.class.getResourceAsStream("/tomcat.properties")); setTomcatEnv(tomcatConfig); start(); } }
tomcat调试maven web工程
- 定义Variable变量:
-
打开首选项:Windows->Preferences
-
定义变量:Run/Debug -> String Substitution:选择右边的新建,建立变量,名称:TOMCAT_HOME,配置为tomcat的路径,如图:
-
- 定义一个java application debug启动:
-
打开Debug Configurations配置:Run -> Debug Configurations
- 选择左边的Java Application,右键新建一个新的Java Application启动配置:取名为:tomcat-dev
-
Main选项卡:Main class输入:org.apache.catalina.startup.Bootstrap
- Arguments选项卡:
-
Program arguments配置填写:start
- VM arguments配置填写:
-
-Dcatalina.home=${TOMCAT_HOME} -Dcatalina.base=${TOMCAT_HOME} -Djava.endorsed.dirs=${TOMCAT_HOME}/common/endorsed -Djava.io.tmpdir=${TOMCAT_HOME}/temp -Djava.library.path=${TOMCAT_HOME}/bin:/usr/local/apr/lib -Dsun.io.useCanonCaches=false -server
-
-
Working directory配置填写:Other: ${TOMCAT_HOME}
-
- Classpath选项卡:
- 去掉项目的classpath,只保留Maven Dependencies项即可
-
选中User Entries:按右边的Advanced添加三个jar包,如:在弹出的Advanced Options对话框中填写Add Variable String项目:${TOMCAT_HOME}/bin/bootstrap.jar
-
${TOMCAT_HOME}/bin/bootstrap.jar ${TOMCAT_HOME}/bin/tomcat-juli.jar ${TOMCAT_HOME}/lib/servlet-api.jar
-
-
-