`
brandNewUser
  • 浏览: 456047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用maven构建基本的web项目结构

阅读更多

 

由于当前公司在组织进行项目基本结构的整理,将以前通过eclipse/ ant 方式构建的项目向maven上迁移,于是便进行maven项目方面的调研。

 

对于maven项目,基本的结构已经在标准文件中:

 

 
 
以及其翻译成中文的相关文档:
 
 
使用一套通用的目录结构的好处是,可以减少开发人员熟悉不同Maven项目时的认知负担。在使用相同的目录结构的情况下,开发人员可以很快的熟悉一个项目。接下来,我们将开始介绍Maven的通用的目录结构。
 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

Maven默认约定了一套目录结构,在通过Maven创建了项目以后,项目的目录结构就是以这套目录结构作为模板创建的。
 
文档中关于所有目录结构的含义如下:
 
src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/it Integration Tests (primarily for plugins)
src/assembly Assembly descriptors
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
 
 
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
在一个Maven项目中,在项目根目录下,除了包含了上面约定的目录结构中的部分目录外,还包含了项目描述文件,pom.xml文件。
 
在根目录下,主要有两个目录,分别是src和target目录,除此之外,还会有一些版本控制系统的元数据文件,包括git的.gitignore或者svn的.svn。如果一个项目时由多个子项目组成的,那么在该项目的根目录下,还会包含它的子项目的目录。子项目的目录布局,默认也是和上面列出的目录结构一致的。
 
在src目录下,包含了项目所有的源代码和资源文件,以及其他项目相关的文件。在该目录的main目录下,包含了构建该项目的artifact(可以理解为时项目的程序部分)所需的代码和资源,而test目录包含了测试相关的代码和资源文件。
 
在目录main和test下的子目录结构,是非常相似的,都包含了两个子目录:java子目录和resources子目录,这两个目录分别放了源代码和资源文件。不同的是,在main目录下的这两个目录中放置了项目主程序的代码,而在test目录下,放置的是测试相关的代码和资源文件。其中java目录是代码的根目录,在该目录下的子目录,就是Java的包名对应的目录结构了。
 
讨论:是否有必要在同一个项目下声明多个source folder(源代码目录)?还是以包名来区分?
 
 
maven需要设置groupId和artifactId,其命名规则需要一起根据公司的策略制定一下。
 
由于当前我们使用git作为版本控制工具,因此.gitignore文件必不可少,基于java项目的文件,考虑到使用eclipse和idea IDE工具都有对应的开发人员:
 
由于我们使用git作为版本管理工具,在使用maven作为build工具时,需要将IDE的工程描述文件以及项目生成的target/,bin/目录忽略掉,因此.gitignore文件必不可少,以下内容可以作为项目的.gitignore文件范本:

# generated files where run in local machine
bin/
target/

# eclipse project description files
.settings/
.project

# idea project description files
.idea/
*.iml

### Java template
*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
 
最终整理的web项目结构如下(用idea作为实例),由于使用SpringMVC,业务上增加了一些java package:
 


 
 
 
 
其他的目录都比较容易理解,下面介绍一下src/main/filter目录的作用:
  
构建项目的过程中,可能会对开发,测试,线上等不同的环境有着不同的设置,或资源,比较常见的是数据库jdbc.properties配置,下面就以这个为具体例子简单介绍一下,参考了下面两篇blog(已经讲得非常详细了)。
  
 
不同的软件开发生命周期阶段、不同的最终客户(用户)环境、不同的运行平台都有可能需要不同配置或资源的情况。假如各个环境下的差别很小的话,我们可以在项目编译之后手工修改或者写个 shell script 自动修改,但如果需要修改的项目很多而且复杂的话,则应该使用 Apache Maven 的 Profile 和 Filtering 功能来解决
 
 
Profile 的作用是允许你在项目文件(pom.xml)里定义若干个 profile 段,然后在编译时选择其中的一个用于覆盖项目文件原先的定义,我们可以在pom文件中定义多个profile,分别表示开发(dev), 测试(test),以及线上(product)用来区分不同的执行环境。
 
<profiles>
    <profile>
      <id>dev</id>
      <properties>
        <active.profile>dev</active.profile>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>

    <profile>
      <id>test</id>
      <properties>
        <active.profile>test</active.profile>
      </properties>
    </profile>

    <profile>
      <id>product</id>
      <properties>
        <active.profile>product</active.profile>
      </properties>
    </profile>
  </profiles>
 
上述设置中表示profile dev为默认的profile,在idea编辑器中,执行maven编译时,选择对应的profile;profile不仅可以在项目中配置,还可以全局配置(下面的sonar就是在全局setting.xml中配置的)。
 


 
 
在pom.xml中声明build标签,用来加入filter文件,${active.profile}就表示当前使用的profile,在profile文件中被定义:
 
<build>
    <finalName>example</finalName>
    <filters>
      <filter>src/main/filters/filters-${active.profile}.properties</filter>
    </filters>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>
 
在src/main/filters目录下存在三个文件:
  • filters-dev.properties
  • filters-test.properties
  • filters-product.properties
 
注意,名称需要与profile的名称保持一致,以满足 filter-${active.profile}文件的通配符。
 
在src/main/resources目录下的全局配置文件 jdbc.properties不指定具体的路径,使用变量来定义:
 
dbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}
 
 
在filters-dev.properties文件就需要如此定义:
 
pom.jdbc.url=dev
pom.jdbc.username=dev
pom.jdbc.password=dev
 
这样在执行maven 构建命令时,默认使用dev profile(默认设置为true),或者通过-P product来产生生产环境下的war包。
 
可以定义多个profile来支持 开发环境/测试环境/生产环境 之间的文件属性替换操作。
 
不同的软件开发生命周期阶段、不同的最终客户(用户)环境、不同的运行平台都有可能需要不同配置或资源的情况。假如各个环境下的差别很小的话,我们可以在项目编译之后手工修改或者写个 shell script 自动修改,但如果需要修改的项目很多而且复杂的话,则应该使用 Apache Maven 的 Profile 和 Filtering 功能来解决
 
 
Profile 的作用是允许你在项目文件(pom.xml)里定义若干个 profile 段,然后在编译时选择其中的一个用于覆盖项目文件原先的定义。
 
或者另外一种方案,这是原来我们工程中大量被使用的方案,在build war包的时候,选择将一些文件排除:
 
<sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resource</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                    <exclude>conf/**</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>package/${package.environment}</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
 
 
这里就会将resources/conf/目录下的文件排除掉,但是此时需要使用其他文件进行顶替,这里就包含了package/${package.environment}目录下的配置文件。
 
配置文件中的package.environment变量是在profile中定义的,每个profile都有着不同的设置,例如dev、test环境就会有所不同。
 
<profiles>
        <profile>
            <id>dev</id>
            <properties>
                <package.environment>dev</package.environment>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <package.environment>test</package.environment>
            </properties>
        </profile>
    </profiles>
 
 
项目目录中都需要有一份完整的配置文件。
 


 
 
如果使用这种方式的话,其实是不知道每个环境的具体配置差异的,只是通过低级的配置文件复制来进行处理(类似于拷贝代码),不利于我们将可变变量统一区分并管理起来,每次更新spring/mybatis配置都需要修改多处的配置文件(执行复制)。
 
但这种方式其实有个好处,就是我们在本地IDE执行时,可以不通过maven调用来进行(如果是Profile+Filter替换的话需要用maven来启动jetty/tomcat)。
 
常用的maven jar包搜索工具: http://mvnrepository.com,如果不知道所在的jar包,也可以使用google进行站内搜索:
 
site:mvnrepository.com xxx.JavaClass,也可以将该搜索源作为maven仓库加入进去:
 
<repository>
      <id>mvnrepository</id>
      <name>mvnrepository</name>
      <url>http://www.mvnrepository.com</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository> 
 
 
关于SnapShots和Release之间的区别,可以参考:http://yongpoliu.com/snapshot-vs-release/
 
对于release版本,我们不能强制将其刷新,maven -U参数可以控制强制刷新snapshots,但是不可以刷新releases,下面是-U参数的说明:
 
-U,--update-snapshots                  Forces a check for missing
                                        releases and updated snapshots on
                                        remote repositories
 
 
由于我们build的release会自动安装(install)到服务器的.m2目录,所以在该服务器上build其他的jar包会成功(假设jenkins是分布式而非单机,这样操作就会失败了)。
 
以前我们设置的release服务器不允许Re-deploy,重复提交RELEASE版本会导致失败,这也是控制RELEASE意外被修改的一种办法。
 
 
 
 
 
 
 
  • 大小: 82.6 KB
  • 大小: 18.6 KB
  • 大小: 27.2 KB
分享到:
评论

相关推荐

    Eclipse使用Maven构建web项目视频教程

    在IT行业中,构建Web应用程序是常见的任务,而Maven和Eclipse是开发人员常使用的工具。本教程聚焦于如何在Eclipse集成开发环境中利用...通过学习这些资料,开发者可以掌握使用Eclipse和Maven构建Web项目的基本技能。

    基于maven创建web项目

    基于maven创建web项目 maven是一种基于项目对象模型(Project Object Model,POM)的项目管理工具,由Apache软件基金会开发和维护。...通过这篇文章,读者可以学习到如何使用maven来构建和管理web项目。

    maven项目转换WEB项目

    本文将详细介绍如何将一个Maven项目转换为Eclipse中的Web项目,并解释Maven的基本目录架构。 首先,让我们了解Maven项目的基本结构。一个标准的Maven项目通常包含以下几个关键目录: 1. `src/main/java`:这是存放...

    Eclipse使用Maven无法建web项目

    首先,我们需要理解“Eclipse使用Maven无法建web项目”这个问题可能涉及到的几个关键点。在Eclipse中创建Maven Web项目时,可能会遇到诸如Maven插件未安装、 archetype配置错误或者网络问题导致的下载失败等常见问题...

    使用 Maven 构建 Web 项目

    在IT行业中,构建Web项目是开发过程中的重要环节,而Maven作为一种强大的项目管理工具,极大地简化了这一过程。本文将深入探讨如何使用Maven来构建一个名为“helloweb”的Web项目,以及相关的知识点。 **一、Maven...

    使用maven构建springMVC项目

    ### 使用Maven构建SpringMVC项目的详细步骤及关键知识点 #### 标题解析与核心知识点说明 - **标题**:“使用maven构建springMVC项目” - **核心知识点**:本篇文章主要围绕如何利用Maven工具来搭建SpringMVC框架...

    idea使用maven创建的web项目

    【标题】:“idea使用maven创建的web项目” 在Java开发中,IntelliJ IDEA(简称Idea)作为一款强大的集成开发环境,结合Maven构建工具,能够帮助开发者高效地管理项目的依赖、构建和部署。Maven是一个项目管理和...

    使用Eclipse构建Maven的Web项目用jetty启动.docx

    使用Maven构建项目有很多优点,例如可以轻松地管理依赖项、简化项目结构、提高项目的可维护性等。 8. Eclipse插件的使用 Eclipse插件可以提高开发效率,例如使用Maven插件可以轻松地管理依赖项、使用jetty插件可以...

    使用Eclipse构建Maven的Web项目

    - Maven Web项目的基本目录结构包括src/main/java(存放Java源代码)、src/main/resources(存放资源文件)、src/main/webapp(存放Web应用资源,如HTML、JS、CSS、Web-INF等)。 - Web-INF目录下应包含web.xml,...

    在MyEclipse中使用maven构建web项目.doc

    在MyEclipse中使用Maven构建Web项目是一个常见的开发任务,Maven是一个强大的项目管理和构建工具,它通过定义项目的结构和依赖关系来自动化构建过程。本文将详细介绍如何在MyEclipse环境中配置Maven并创建一个标准的...

    idea创建maven web项目标准结构源码

    一个典型的Maven Web项目结构如下: 1. **src/main/java**:这是放置Java源代码的地方,按照包名规范进行组织。例如,如果项目名为`com.example.webapp`,那么对应的目录结构应为`src/main/java/...

    Eclipse创建基于MAVEN的web项目

    使用Eclipse创建Maven版的Web项目需要通过Maven的项目模板来建立项目,然后配置项目的结构和依赖关系,最后构建项目的框架。本文将详细介绍每一步骤的操作。 标签解释 标签"Maven Web"表示本文的主要内容是关于...

    SpringBoot+maven构建Web项目(Maven父子工程)

    总结来说,使用SpringBoot+maven构建Web项目,可以高效地组织项目结构,简化配置,加速开发流程。通过父子工程的方式,可以更好地管理和共享项目资源,使得大型项目的开发和维护变得更加便捷。结合SpringBoot的自动...

    使用Maven构建JavaWeb项目实例

    本实例将详细讲解如何使用Maven构建一个完整的JavaWeb项目。以下将围绕Maven的配置、依赖管理、插件使用以及JavaWeb项目的结构等方面进行深入探讨。 一、Maven的简介与安装 Maven是Apache软件基金会开发的一款项目...

    使用Maven的struts2项目结构

    接下来,我们将深入探讨如何使用Maven构建一个基于Struts2的项目,并理解其项目结构。 1. **Maven工程的基本结构**: Maven项目遵循标准的目录结构,也称为"Maven约定"。这是项目的基础布局: - `src/main/java`...

    maven多模块web项目

    总的来说,"maven多模块web项目"是一个采用Maven构建、整合Spring MVC和Spring的Web应用程序,利用IDEA进行开发,拥有清晰的模块化结构和标准的Web应用目录布局,便于团队协作和维护。通过理解Maven的生命周期和目标...

    使用Maven构建Spring MVC项目的简单示例

    通过结合这两个强大的技术,我们可以高效地开发Java Web项目。 首先,我们需要了解Maven的基本概念。Maven通过一个名为`pom.xml`的项目对象模型(Project Object Model)文件来管理项目的构建、报告和依赖。在`pom....

    maven web项目 Demo

    【maven web项目 Demo】是基于Maven构建的Web应用程序示例,旨在帮助开发者理解如何使用Maven管理和构建Web项目。Maven是一个强大的项目管理工具,它自动化构建过程,包括编译、测试、打包、部署等,使得开发更加...

Global site tag (gtag.js) - Google Analytics