配置Maven项目自动编译

##Maven项目目录结构如下:

project
- src
- main
- java
- resources
- webapp
- WEB-INF
- classes
- lib
- target
- project-snapshot
- WEB-INF
- classes
- lib
- classes

其中 project-snapshot就是maven编译生成的项目目录了,我们一般使用这个目录对项目进行部署,这样问题来了:

每次改动JSP文件或者Java文件,都得重新用maven编译一下,以便生成代码到该目录,有没有方便点的做法呢?接下来就是啦。

让Maven项目自动编译:

为了让改写JSP之后无需重新编译,我们只有使用src/main/webapp/这个目录进行部署了,因为一般我们是直接改动里面的文件进行编码的;

lib目录

而jar包是maven从仓库下载过来的,为了能用上下载回来的jar包,我们可以把

target/project-snapshot/WEB-INF/lib

目录联接到

src/main/webapp/WEB-INF/lib

windows下通过`mklink /j`命令(假设项目在D:/dev目录下):

mklink /j “D:\dev\project\src\main\webapp\WEB-INF\lib” “D:\dev\project\target\project-snapshot\WEB-INF\lib”

这样就把maven下载的lib目录联接到部署目录webapp下了;

class目录

对于class目录,也是同样的方法,另外需要设置IDE的自动编译输出目录到:

target/project-snapshot/WEB-INF/classes

右击项目 -> properties -> Java Build Path -> 右边面板底部设置Default output folder;

直接运行main方法的问题

但是这样Eclipse下会有个问题,直接运行某个类的main方法,会提示如下错误:

java.lang.NoClassDefFoundError: me/arthinking/test/Demo
Caused by: java.lang.ClassNotFoundException: me.arthinking.test.Demo
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread “main”

原因是没有读取到输出的classes文件,为此,我们可以把class编译输出目录设置为:

project/target/classes

这样就可以正常执行main方法了

把这个目录联接到webapp/WEB-INF/classes目录下即可。

编译目录设置如图:

20141204-java01

其他的配置文件目录需要联接到webapp目录,同上操作。

关于IDEA集成开发环境

据Ryan介绍,IDEA集成开发环境是不会存在找不到main方法的问题的;

另外我们也可以在pom.xml中配置classes文件的输出目录,把classes文件输出到webapp目录下,这样改写了Java文件之后需要使用maven编译下项目了。

pom.xml

D:\dev\project\webapp\WEB-INF\classes
arthinking wechat
欢迎关注itzhai公众号