在Eclipse中创建的Dynamic Web Project 类型的Web 项目, 通过Run As -> Run on Server 可以添加本地安装的Tomcat,在Eclipse 中启动Tomcat 进行整合开发。
但是如果创建的是Maven类型的项目,如果没有导入额外的包还正常, 但是只要在pom.xml 中引入了其他的包,会报找不到Class的错误, 如下图:
如果在Eclipse 中对Maven 类型的项目可以直接整合Tomcat 运行呢?首先来看看两者的项目的结构。
项目结构比较
为了开发的结构清晰和区别度, 在 Eclipse中看到的项目的结构和实际的文件结构有一些差异, 而不同类型的项目的结构也是不同的。
Maven类型的项目结构如下:
其结构的特点是:
- 分离了Java代码和配置文件, 也就是src/main/java 和src/main/resources
- 注重单元测试, 有src/test 目录
- Web资源相关的文件在src/main/webapp 下进行添加。
Dynamic Web Project类型的结构如下
动态Web 项目主要分为java 代码(src)和Web内容(WebContent)。
Eclipse 项目结构揭秘
Eclipse 是如何定义项目的类型的呢? 答案就是项目里的 .project
文件来记录的, 以动态Web项目为例, 该文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>myapp</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
而对于Maven类型的项目, .project
的内容则类似:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>javaweb</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
可以看到, Maven 类型的项目的nature 有org.eclipse.m2e.core.maven2Nature
, 构建命令(buildCommand)则包含 org.eclipse.m2e.core.maven2Builder
。
在Maven项目中集成Tomcat 服务器
在Eclipse中可以直接运行动态Web项目,而不需要把Web项目打包到服务器目录中, 方式是右键单击项目,选择 Run As -> Run On Server, 如下图:
在弹出的对话框中, 选择对应的 Tomcat版本和本地Tomcat的路径,类似:
这里就遇到了开篇的问题, 如果是Maven类型的项目, 通过这种方式会找不到pom.xml 导入的第三方包,何也? 因为这是两种不同类型的项目。有解法吗? 当然有。
很简单, 右键单击项目, 选择 “Properties”, 在弹出对话框选择“Deployment Assembly”, 点击右边的 “Add”按钮, 在弹出框种选择 “Java Build Path Entries”, 将Maven Dependencies 添加进来。
整个步骤的目的就是: 将Maven的依赖项添加到动态项目的lib 目录中, 操作的界面如下: