`
brandNewUser
  • 浏览: 447893 次
  • 性别: 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
分享到:
评论

相关推荐

    maven安装包

    以前做过的项目中,没有...最近一段时间在项目过程中使用Maven,用Maven构建的web项目,其项目结构只停留在了解阶段,没有深入的使用与理解,刚好最近看了一篇关于Maven的详解;就开始深入学习一下Maven的具体应用。

    maven window下安装包

    第13章:使用Maven生成项目原型/13.1 Maven项目原型/13.1.4 命令行生成的web项目原型 第13章:使用Maven生成项目原型/13.2 编写自己的项目原型/13.2.1 自定义项目原型结构组成 第13章:使用Maven生成项目原型/13.2 ...

    使用IDEA中的Maven创建一个Web项目

    (一)创建web项目 File -&gt; New -&gt; Project 出现如下图所示: 出现上图所示,项目就创建完毕了。 (二)项目配置 项目目录结构如下所示:...到此maven创建的web项目构建完毕。 参考:https://blog.csdn.net/qq_378563

    Maven权威指南 很精典的学习教程,比ANT更好用

    使用Maven Dependency插件进行优化 8.6. 最终的POM 8.7. 小结 II. Maven Reference 9. 项目对象模型 9.1. 简介 9.2. POM 9.2.1. 超级POM 9.2.2. 最简单的POM 9.2.3. 有效POM 9.2.4. 真正的POM 9.3. ...

    Maven2 的新特性.7z

    如创建web项目,可以使用命令: mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp 5. 生命周期的引入 在Maven2中有了明确的生命周期概念...

    smm分模块构建工程

    smm分模块构建工程使用maven管理,对web层,持久层,业务层进行分模块构建,提高代码复用性.

    基于SpringBoot+Maven+Opencv实现的图像深度学习项目,保证可靠运行,附赠计算机答辩PPT模板

    通过Maven的依赖管理和项目构建功能,确保了项目代码的规范性和可维护性。同时,OpenCV库的运用使得项目在图像处理和分析方面具备了强大的能力,能够处理各种复杂的图像数据。 在深度学习方面,该项目采用了先进的...

    java写webapi源码-AdvanceJavaFlavors:高级JavaFlavors

    java写webapi源码它是什么? 该存储库由 Maven、Spring、Hibernate、AngularJS、JUnit 框架中的简单代码示例组成。...创建一个基本的项目结构来编写 JUnit 测试并编写一个简单的 JUnit 测试 'RESTful' 创

    jersey_example:使用Jersey和Maven的简单JAX-RS示例

    Maven是可帮助组织和构建项目的工具。 当您有许多要构建和引用的项目时,这非常有用,这在大型Java应用程序中非常常见。 使用的工具和技术:适用于Mozilla Firefox的Java,使用Jersey,Maven,POJO,Eclipse,...

    Maven快速入门

    那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能...

    aem-project-archetype:用于在AEM上创建最佳实践网站的Maven模板

    Maven模板创建一个最小的,基于最佳实践的Adobe Experience Manager(AEM)项目作为您网站的起点。 文献资料 :原型架构及其不同模块的概述。 以下教程基于该原型: :了解如何启动一个全新的网站。 WKND SPA...

    SSM项目ssm数据结构学习网(vue).zip

    4. **开发细节**:在搭建后端时,需要创建一个Maven的Web项目,这样才能为前端提供必要的后端服务。而前端则通过vue-cli进行搭建,这是一个官方提供的脚手架工具,可以帮助开发者快速生成Vue.js项目的初始结构。 5. ...

    最新基于SSM框架ssm网络视频播放器.zip

    - SSM框架整合提供了良好的分层架构,使得项目结构清晰,便于维护和扩展。 - 使用JSP技术有助于在Web前端展示动态内容,提升了用户界面的互动性。 - 通过使用Maven作为项目构建工具,可以方便地管理项目依赖和构建...

    webchat-SSM-version2:基于websocket的web聊天室 Spring + Spring MVC + Mybatis+mysql。 适合大学生课程设计等课程使用

    项目使用Maven构建,后台使用的语言是JAVA 框架为Spring + Spring MVC + Mybatis 数据库使用的是Oracle 10gMySQL 前端采用,弹窗和分页使用的是,当然还有... 开发工具使用的是 二.数据交互格式 在WebChat中定义的前...

    Spring Assistant/Initializr初始化SpringBoot项目

    Spring Initializr/Assistant从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构...虽然不能生成应用程序代码,但它能为你提供一个基本的项目结构,以及一个用于构建代码的Maven或Gradle构建说明文件。

    lifestream:一个Maven项目,它为我在各种Web服务上的每个条目生成markdown文件(当前计划的是wordpress,Goodreads,也许还有StackExchange网站)

    目前设想以下结构lifestream-plugins(所有groovy插件的根目录,用于从外部站点获取数据并将其转换为markdown文件以供站点生成器使用) utils(包含模板的显而易见的实用程序项目) WordPress的好读Shaarli 堆栈...

    基于SpringBoot+vueweb的智慧社区设计与实现(源码+部署说明+演示视频+源码介绍).zip

    这是一个基于SpringBoot和Vue.js的智慧社区设计与实现的项目资源包。它包含了完整的源码、部署说明、演示视频以及源码介绍,帮助开发者快速搭建和理解智慧社区系统。...整个项目结构清晰,代码规范,易于阅读和维护。

    web-qq:Angular2练习项目之Web聊天室

    前端使用了Angular技术,后端则使用Spring Boot,使用数据库为mysql,采用maven进行构建项目。项目结构src-- main-- -- angular-- -- java-- -- resources-- testsqlpom.xml运行项目1.下载 git clone https

Global site tag (gtag.js) - Google Analytics