Eclipse中一个Maven工程的目录结构 (MacOS)
www.cnblogs.com 2016-11-04 17:33
1. 为什么写这篇文章
在之前的javaSE开发中,没有很关注Eclipse工程目录下的环境,总是看见一个src就点进去新建一个包再写一个class。以后的日子中也没有机会注意到一个工程到底是怎么组织的这种问题,更不要说自己试试怎么控制了。
但是最近在学习Maven的时候知道了它对工程的目录结构有要求,也就是所谓的“惯例优于配置”。有一个被绝大多数人认可的java工程的目录结构被确定下来。这样统一了市面上各种复杂配置的工程。于是我便重新开始查资料,看看别人到底如何安排一个优秀的工程框架的。
同时,我也分析了Eclipse会给一个项目生成什么配置文件,其中的内容和意义又是什么.这样能心里面大致有个数,本地的什么文件是干什么的,怎么来的。
2. 一个简单的J2SE工程目录结构
首先,Mac中,一个默认的Eclipse工程的目录结构:
看上去就这么多?其实不是的,在我的mac环境下,一般时候Eclipse左边的目录是Package Explorer,也是是如上图显示的内容。但是其实可以用另外一个显示其真正的目录,也就是包含一些隐藏文件。叫Navigator(事实上Package Explorer默认隐藏Linux系统下的以.开头的隐藏文件,所以看不见,而Navigator默认打开)。显示效果如下:
3. 为什么Eclipse能认出来这些?
那么除了这些之外,其实还有值得探究的部分:
这些问题可以提出很多,其实本质上都是:Eclipse是一个集成开发环境,而Maven是一种项目管理及自动构建工具(维基百科),Eclipse没有责任去“识别”Maven。这句话乍一听感觉和直觉不相符合:明明新建工程的时候选择新建一个Maven工程,Eclipse就知道这是一个Maven工程啊?明明导入一个Maven工程,Eclipse就能正确识别打开啊?
其实是Eclipse帮我们做了很多。所以问题的答案是:Eclipse是通过配置文件来“认知”一个工程的。而这些配置文件,都是一些隐藏文件。你新建一个Maven工程,其实是按照模板写好了这些配置文件,所以Eclipse才能读出来这个工程的相关信息。
(一)我们先看一个普通的J2SE工程的配置文件的内容和其效果,工程如下:
1,.settings文件夹下的那个文件:org.eclipse.jdt.core.prefs。里面的内容是:
1 eclipse.preferences.version=1 2 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 org.eclipse.jdt.core.compiler.compliance=1.8 6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 org.eclipse.jdt.core.compiler.source=1.8
很明显,是明确jdk的,还有一些编译器的参数的配置。
2,.classpath。这个隐藏文件的内容是:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <classpath> 3 <classpathentry kind="src" path="src" /> 4 <classpathentry kind="con" 5 path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" /> 6 <classpathentry kind="output" path="bin" /> 7 </classpath>
这个比较重要,因为这个文件直接控制了一个工程的目录结构。kind属性为src,表示这个文件夹是放源码的文件夹,物理位置在/src。也就是我们看到的那个文件夹。
kind属性为con,也就是config,里面控制的是这个工程的JVM,JDK,等等信息,一把来说我们不需要的修改。kind属性为output,说明了编译后产生的class文件放在物理地址:/bin里面。
看到这个文件的配置,我们就知道前面为什么工程的目录安排是那样的了,换句话说,正是这个文件的配置,工程才体现那样的目录。再进一步说,如果你在这个文件里面按照你的想法配置,那么你保存之后,项目的目录结构会自动变成你安排的那样。
3,.project。内容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <projectDescription> 3 <name>MyProject</name> 4 <comment></comment> 5 <projects> 6 </projects> 7 <buildSpec> 8 <buildCommand> 9 <name>org.eclipse.jdt.core.javabuilder</name> 10 <arguments> 11 </arguments> 12 </buildCommand> 13 </buildSpec> 14 <natures> 15 <nature>org.eclipse.jdt.core.javanature</nature> 16 </natures> 17 </projectDescription>
也是一些关于编译的配置文件,下面讲Maven还会讲到。
以上是一个普通java工程的所有文件和其目录结构,可以看到在我之前编写代码时没仔细注意的地方,一些配置文件对工程的结构做出了约束。
(二)接下来是一个Maven工程。
在Package Explorer里面看到的目录结构是:
几个不同点:
1. Source Folder不是一个简单的src,而是src/main/java因为Maven是一种强约束的工程类型。它对工程的文件命名和格式要求比较严格。其好处是指定了规范,方便代码的移植和理解。上文中的src/main/java是个什么呢?其实是一个路径,打开其物理地址会发现,是一个src文件夹包含了一个main文件夹,再包含了java文件夹。这样的层次的文件路径一共有4个,如下:
当然,这4个不是都必须有。前两个一般都有,后两个可能没有(不需要测试)。
与之类似的,如果一个包的名字是com.jd.MyProject,那么它在硬盘上的目录结构就是com/jd/MyProject。
2.  有一个target文件夹
很简单,就是源码编译后生成的class文件放的地方(如果是一个WEB应用,还有别的信息也在编译打包之后放在target里面)。具体放的时候也会根据是工程代码还是测试代码区分放置class文件。
3. 一个pom.xml。这个文件可以说是一个Maven工程最重要的文件了,因为这个是Maven的基础配置文件,和程序员打交道最多的也在这个文件里面,包括配置依赖关系等等。
根据上文描述,我们都知道了Eclispe里面的.开头的隐藏文件真正配置了工程的目录结构等等。那么这个Maven工程的配置文件里面写的是什么呢?
1,.settings:是Maven工程的一些配置,比如JDK版本和文件编码格式(UTF-8),比如父工程和子Module的依赖关系。
2,.classpath,这个文件内容变化了:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <classpath> 3 <classpathentry kind="src" output="target/classes" path="src/main/java"> 4 <attributes> 5 <attribute name="optional" value="true" /> 6 <attribute name="maven.pomderived" value="true" /> 7 </attributes> 8 </classpathentry> 9 <classpathentry kind="src" output="target/test-classes" 10 path="src/test/java"> 11 <attributes> 12 <attribute name="optional" value="true" /> 13 <attribute name="maven.pomderived" value="true" /> 14 </attributes> 15 </classpathentry> 16 <classpathentry kind="con" 17 path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"> 18 <attributes> 19 <attribute name="maven.pomderived" value="true" /> 20 </attributes> 21 </classpathentry> 22 <classpathentry kind="con" 23 path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> 24 <attributes> 25 <attribute name="maven.pomderived" value="true" /> 26 </attributes> 27 </classpathentry> 28 <classpathentry kind="output" path="target/classes" /> 29 </classpath>
之前我们知道了一个Maven工程目录结构什么样子,这里就可以看出来为什么这个样子。正是这个文件的配置,让工程在Eclipse里面体现出来了与之前不一样的目录结构。具体一点就是它重新规定了各种文件(源码,配置,输出)在工程中存放的目录。事实上,你在Eclipse里面做工程目录的修改的核心都是修改这文件,从而体现你的修改。
3,.project.xml
这个文件可以说是很重要的,因为一开始我思考的问题是:怎么样把一个普通的JavaSE工程变成一个Maven工程的答案就在这里。我一点点修改,终于发现了最关键的一点,也就在这个文件里面。文件内容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <projectDescription> 3 <name>MavenDemo</name> 4 <comment></comment> 5 <projects> 6 </projects> 7 <buildSpec> 8 <buildCommand> 9 <name>org.eclipse.jdt.core.javabuilder</name> 10 <arguments> 11 </arguments> 12 </buildCommand> 13 <buildCommand> 14 <name>org.eclipse.m2e.core.maven2Builder</name> 15 <arguments> 16 </arguments> 17 </buildCommand> 18 </buildSpec> 19 <natures> 20 <nature>org.eclipse.jdt.core.javanature</nature> 21 <nature>org.eclipse.m2e.core.maven2Nature</nature> 22 </natures> 23 </projectDescription>
可以看到多了两行。一个在buildCommand标签里面,一个在natures标签里面。如果你在一个普通的JavaSE工程里面加入了
可以看到Eclipse就会在工程图标上加上一个M,认定其是一个Maven工程。删除这句话再保存,前面多出来的那句话也会自动删除。说明这句话正是确定这个工程“特性”的关键。
这个特性本身不重要,重要的是终于明白了,看上去很简单的东西,别人究竟是怎么实现的。在平常觉得理所当然的操作-->结果的背后,也许就体现了别人设计的智慧。比如这里:通过文件记录工程的目录结构。
以上就是Maven和普通工程的一些工程结构上的区别,以及造成这些区别的原因。

转载于:https://www.cnblogs.com/celine/p/7910948.html

maven工程的目录结构相关推荐

  1. MAVEN项目标准目录结构 ;

    http://blog.csdn.net/lengyue_wy/article/details/6718637 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.标准目录结构: src -ma ...

  2. MAVEN约定的目录结构

    maven工程必须按照约定的目录结构创建 根目录:工程名 |-src:源码 |-|-main:存放主程序 |-|-|-java:java源码文件 |-|-|-resource:存放框架的配置文件 |- ...

  3. maven项目的目录结构

    1.maven项目采用"约定优于配置"的原则: src/main/java:约定用于存放源代码, src/test/java:用于存放单元测试代码,(测试代码的包应该和被测试代码包 ...

  4. iOS项目工程及目录结构

    做过一些iOS的项目,不同项目的沉淀没有积累到一起,目录的管理都在后期随着人员的增加越来越混乱,因此在这里做一些梳理,希望达到两个目的. 一套相对通用的目录结构,作为后续项目的模版. 积累相应的基础库 ...

  5. 解决IDEA修改已有项目为maven项目时目录结构被改变的问题

    Idea可以在项目根目录上右键选择"添加框架支持",选择maven,为项目添加Maven支持. 但这样会导致原有项目的目录结构被破坏. 更好的方法是在根目录添加pom.xml文件 ...

  6. Maven下载及目录结构

    1.检查JDK的版本: JDK版本1.7及以上 2.下载地址:http://maven.apache.org/download.html 3.配置环境变量:解压后把Maven的根目录配置到系统环境变量 ...

  7. jsp项目在idea需要导入什么依赖_idea中的java web项目(添加jar包介绍)和java maven web项目目录结构...

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  8. caffe这个c++工程的目录结构

    目录结构 caffe文件夹下主要文件: data 用于存放下载的训练数据 docs 帮助文档 example 一些代码样例 matlab MATLAB接口文件 python Python接口文件 mo ...

  9. maven工程的标准目录结构

    Maven工程的目录结构 作为一个maven工程,它的src目录和pom.xml是必备的. 进入src目录后,我们发现它里面的目录结构如下: src/main/java -- 存放项目的.java文件 ...

最新文章

  1. 9 岁自学编程、24 岁身价涨至数百万美元,与微软一较高低的大佬多厉害?
  2. 物联网奇点:给物联网设备使用的Docker
  3. python怎么导入文本-如何导入其他Python文件?
  4. WPF 基础控件之 DataGrid 样式
  5. 聊一聊Jmeter的参数化
  6. python 怎么将数组转为列表_怎么将视频转为GIF动态图 表情包怎么制作
  7. 将一个字段分成3个 php,整理几个方法
  8. 区块链 Fisco bcos 智能合约(17)-区块链的速度困境:“贵”在信任,“慢”得其所
  9. linux openfire mysql_Linux系统安装openfire及其如何后台运行openfire
  10. 远程连接工具Putty 相关
  11. Linux ——IP配置修改
  12. 跳转到新页面并清除当前页面的history记录
  13. oracle12c口令文件,学习笔记:Oracle 12C ASM 新特性 共享密码文件
  14. 离散数学 代数系统思维导图
  15. 搭建CTPN网络(基于windows与tensorflow)
  16. 自定义类加载器加载冲突类(一)-ClassLoader
  17. Python爬虫的学习
  18. 深度学习笔记(6)BatchNorm批量标准化
  19. webservice 天气预报的接口
  20. 010108权限提升

热门文章

  1. 转 SqlServer的查询通知功能 从sqlserver层面上来解决界面数据的即时更新
  2. 江门市主城区停车设施专项规划草案(附下载)
  3. arm java 性能怎么样,Arm macbook 总有人问适合开发吗
  4. mysql distinct 去掉查询结果重复记录 可用于多张表连接查询
  5. SSD固态硬盘接口 M2
  6. Photoshop CS2 视频教程-PS涂抹工具(转)
  7. 第19天笔记,js(递增递减运算符、if语句)
  8. 物联网平台 智慧小区 农田物联网 智慧旅游 智慧消防
  9. Excel 计算某一列不重复的值的个数公式
  10. 老潘的思考(AI部署、方向、就业)!