新java项目搭建参考规范

 

本规范基于多年实施的教训,汇集在此.

编写本规范的目的是为了确保项目实施过程中,任何人,任何电脑,只要在项目根目录下执行mvn jetty:run或者mvn spring-boot:run,就可以本地启动项目进行代码的开发测试,执行mvn package -P test就可以生成测试环境的版本包,执行mvn package -P prod就可以生成生产环境的版本包.摈弃了对IDE(eclipse,myeclipse,idea),操作系统默认字符集的限制.

本规范针对所有新建的java项目

  1. 所有项目全部基于MAVEN进行搭建(不允许使用gradle),全部安装maven3.6.2以上版本.新建项目禁止基于IDE的新建工程向导进行项目搭建.
  2. 所有项目全部基于UTF-8编码进行开发,项目中所有应该是utf-8的文件必须是utf-8编码,个别如properties文件只能是iso-8859-1例外,也不要在properties文件中添加中文注释,后期都会乱码.如果接口规定其他字符,在接口进行代码转码处理.
  3. JAVA WEB项目全部基于jetty:run插件进行开发,禁止使用外置tomcat进行开发测试.
  4. 所有三方库只允许使用MAVEN依赖配置的方式进行依赖管理,禁止手动下载jar包添加到项目中(eg:WEB-INF/lib),更不允许将三方库直接上传到版本库.
  5. 所有项目禁止直接依赖class文件.禁止将class文件提交到版本库.
  6. 所有项目禁止将IDE的工程配置文件提交到版本库.(my)eclipse [.classpath|.project|.settings],idea [.iml|.idea]
  7. 所有项目禁止将项目非源码文件提交到版本库包括但不限于开发测试过程中的日志文件[*.log],jrebel插件的配置文件[rebel.xml],项目编译后的文件夹[target]
  8. 所有pom.xml中配置的依赖必须配置版本号
  9. 所有pom.xml中配置的依赖必须配置<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>,<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
  10. 所有项目都必须配置profile支持开发,测试,生产多环境打包.
  11. [推荐]推荐不使用IDE自动生成get,set方法,使用lombok插件的@Setter,@Getter,@@ToString注解
  12. [推荐]推荐使用lombok插件的@Slf4j注解,不需要手写日志成员变量.
  13. 所有接口方法上必须添加javadoc,有变动必须添加额外的注释.
  14. [推荐]同一个项目的多个工程,使用maven module进行组合整理,便于代码维护.
  15. SVNtrunk,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