本规范基于多年实施的教训,汇集在此.
编写本规范的目的是为了确保项目实施过程中,任何人,任何电脑,只要在项目根目录下执行mvn jetty:run
或者mvn spring-boot:run
,就可以本地启动项目进行代码的开发测试,执行mvn package -P test
就可以生成测试环境的版本包,执行mvn package -P prod
就可以生成生产环境的版本包.摈弃了对IDE(eclipse,myeclipse,idea),操作系统默认字符集的限制.
本规范针对所有新建的java项目
- 所有项目全部基于MAVEN进行搭建(不允许使用gradle),全部安装maven3.6.2以上版本.新建项目禁止基于IDE的新建工程向导进行项目搭建.
- 所有项目全部基于UTF-8编码进行开发,项目中所有应该是utf-8的文件必须是utf-8编码,个别如
properties
文件只能是iso-8859-1
例外,也不要在properties文件中添加中文注释,后期都会乱码.如果接口规定其他字符,在接口进行代码转码处理. - JAVA WEB项目全部基于jetty:run插件进行开发,禁止使用外置tomcat进行开发测试.
- 所有三方库只允许使用MAVEN依赖配置的方式进行依赖管理,禁止手动下载jar包添加到项目中(eg:WEB-INF/lib),更不允许将三方库直接上传到版本库.
- 所有项目禁止直接依赖class文件.禁止将class文件提交到版本库.
- 所有项目禁止将IDE的工程配置文件提交到版本库.
(my)eclipse [.classpath|.project|.settings]
,idea [.iml|.idea]
- 所有项目禁止将项目非源码文件提交到版本库包括但不限于
开发测试过程中的日志文件[*.log]
,jrebel插件的配置文件[rebel.xml]
,项目编译后的文件夹[target]
- 所有pom.xml中配置的依赖必须配置版本号
- 所有pom.xml中配置的依赖必须配置
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
,<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
- 所有项目都必须配置profile支持
开发
,测试
,生产
多环境打包. - [推荐]推荐不使用IDE自动生成get,set方法,使用lombok插件的
@Setter
,@Getter
,@@ToString
注解 - [推荐]推荐使用lombok插件的
@Slf4j
注解,不需要手写日志成员变量. - 所有接口方法上必须添加javadoc,有变动必须添加额外的注释.
- [推荐]同一个项目的多个工程,使用maven module进行组合整理,便于代码维护.
- SVN
trunk
,tag
,branch
,每个目录都有约定的含义,禁止将a项目上传到trunk路径,又将b项目上传到branch路径.
pom.xml文件参考
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hfvast.yanfa</groupId>
<!-- 项目名 -->
<artifactId>platform</artifactId>
<!-- 多模块项目的父pom类型是pom 普通web子模块是war spring-boot做了特殊化改造不是war是jar -->
<packaging>pom</packaging>
<version>1.4.1-SNAPSHOT</version>
<name>EAP开发平台-${project.version}</name>
<!-- 多模块项目配置子模块 -->
<modules>
<module>qlanguage_lib</module>
<module>qlanguage_dev</module>
<module>qlanguage_platform</module>
<module>qlanguage_mongodb</module>
<module>qlanguage_permission</module>
<module>qlanguage_permission_bean</module>
<module>qlanguage_util</module>
<module>qlanguage_taglibs</module>
<module>qlanguage_platform_boot_run</module>
<module>qlanguage_session</module>
</modules>
<!-- 配置了三套环境 默认使用dev环境 必须配置 -->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
<!-- 变量 多个dependency使用同一个变量 统一升级依赖版本号 -->
<properties>
<java.version>1.8</java.version>
<!-- 文件拷贝时的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 编译时的编码 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<spring.version>4.3.23.RELEASE</spring.version>
<spring.security.version>4.2.12.RELEASE</spring.security.version>
<jetty.version>9.4.18.v20190429</jetty.version>
<!-- log about -->
<lombok.version>1.18.8</lombok.version>
<slf4j.version>1.7.25</slf4j.version>
<logback.version>1.2.3</logback.version>
</properties>
<!-- 添加依赖的位置 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- slf4j的实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 日志api 门面 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 将comming-logging日志转接到桥接到slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 将jdk-logging日志转接到桥接到slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
<build>
<!-- 指定maven打包后的文件名 -->
<finalName>ROOT</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>dev/**</exclude>
<exclude>test/**</exclude>
<exclude>prod/**</exclude>
<exclude>jetty.xml</exclude>
<exclude>rebel.xml</exclude>
<exclude>webdefault.xml</exclude>
</excludes>
</resource>
<!-- 配合profile完成多环境自动识别并打包 -->
<resource>
<directory>src/main/resources/${profiles.active}</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
<include>dbcp.properties</include>
</includes>
</resource>
</resources>
<plugins>
<!-- 配置maven编译的参数 要求jdk1.8 使用utf8字符集 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 配置生成源码包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 配置jetty插件 启动web项目 -->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<httpConnector>
<!-- web项目的监听端口 -->
<port>8080</port>
</httpConnector>
<!-- 当发送stop字符到8889端口时 web容器会关闭 -->
<stopKey>stop</stopKey>
<stopPort>8889</stopPort>
<webAppConfig>
<!-- 配置此文件支持热修改静态资源文件 -->
<defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
<!-- 配置应用的二级应用名 -->
<contextPath>/VAC</contextPath>
</webAppConfig>
</configuration>
</plugin>
</plugins>
</build>
<!-- 配置私库的地址 需要在本地的$M2_HOME/conf/settings.conf 配置访问私库的用户名,密码 这种配置是使用私库中的依赖,向私库中打包是另外一种配置 -->
<repositories>
<repository>
<id>hfvast-net-snapshots</id>
<name>nexus</name>
<url>https://nexus.hfvast.net/repository/snapshots/</url>
<snapshots>
<enabled>true</enabled>
<!--always(实时更新不需要删除本地仓库) daily(每天更新) interval:xxx(隔xxx分钟更新一次) never(从不更新) 默认为daily -->
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>hfvast-net-releases</id>
<name>nexus</name>
<url>https://nexus.hfvast.net/repository/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<id>hfvast-net-thirdparty</id>
<name>nexus</name>
<url>https://nexus.hfvast.net/repository/thirdparty/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>
.gitignore文件参考
/*/*.iml
/*/target
/*/*.idea
/*/*.settings
/*/*.project
/*/*.classspath
.idea
.settings
.svn
.project
.classpath
*.iml
/*/logs
/*/*.log
/*/overlays
/**/rebel.xml