【gradle】idea+gradle 多模块项目创建教程入门例子

前言

详情可参考:
Gradle构建多模块项目

项目创建配置

新建项目
【gradle】idea+gradle 多模块项目创建教程入门例子

选择本地的gradle,保证gradle的版本至少为4或以上。
【gradle】idea+gradle 多模块项目创建教程入门例子

填写group、artifactid、版本号。

【gradle】idea+gradle 多模块项目创建教程入门例子

根节点项目创建完毕。
【gradle】idea+gradle 多模块项目创建教程入门例子

然后,创建多个模块,假设背景为需要进行远程调用的提供者服务,这里以 api 和 web 模块为例,

api -模块

新建模块:
【gradle】idea+gradle 多模块项目创建教程入门例子

模块名称存放位置:
【gradle】idea+gradle 多模块项目创建教程入门例子

创建成功。
【gradle】idea+gradle 多模块项目创建教程入门例子

web模块

【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

创建成功。

配置

可以看到根目录下面的setting.gradle的内容为:
【gradle】idea+gradle 多模块项目创建教程入门例子

修改根项目下面的build.gradle
例子:

/***所有项目共通***/
group 'net.w2p'
version '1.0-SNAPSHOT'


allprojects {

    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'groovy'


    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    idea {
        module {
            inheritOutputDirs = true
        }
    }
    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
    tasks.withType(GroovyCompile) {
        groovyOptions.encoding = "MacRoman"
    }

    // java编译的时候缺省状态下会因为中文字符而失败
    [compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8'

    repositories {
        maven{
            //更换为阿里的仓库
            url  'http://maven.aliyun.com/nexus/content/groups/public'
        }
        //有些jar包在*仓库是没有的,需要手动添加上去
//        flatDir {  dirs 'local_jars' }
//        mavenCentral()
    }
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'


    }
}
// 所有子项目的通用配置
subprojects {

    dependencies {
        // 通用依赖

        // 测试依赖
        testCompile(
                "junit:junit:4.12"
        )
    }

}





在web项目下面引入api项目的依赖,

plugins {
    id 'java'
    id 'war'
}

group 'net.w2p'
version '1.0-SNAPSHOT'


repositories {
    mavenCentral()
}

dependencies {
    compile project(":FileServerApi")

    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'

}

然后,编译web项目部署到tomcat下面,tomcat部署设置如下:
【gradle】idea+gradle 多模块项目创建教程入门例子

成功生成,可以看到文件目录:
【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子
FileServerApi项目正常编译过来,而且FileServerWeb项目的资源以及jsp文件正常部署。

idea的web网站404访问勘误

假如到上面一步你可以直接访问到index.jsp,那么就不用往下面看了。
假如不是的话,而是
【gradle】idea+gradle 多模块项目创建教程入门例子

这样无法访问,可以继续往下面看。

当看到这个的时候查了一下资料,有:
IntelliJ IDEA新建Gradle项目启动404

这位兄弟说:
【gradle】idea+gradle 多模块项目创建教程入门例子

另外一篇文章,
IDEA Gradle 项目 Tomcat运行 404

作者说的是:

以下图片文字都摘抄自【小孩小烦恼】的博客,请知悉。

出现404的解决方案:
【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

于是,问题解决。
【gradle】idea+gradle 多模块项目创建教程入门例子

【小孩小烦恼】的文章抄录完毕

上面的方法是针对其中一部分问题的解决方案,不过,话说,Store generated project files externally 到底是什么,为什么会导致404的?下面进行求证

Store generated project files externally的选项的作用

我们分别对setting里面的Store generated project files externally进行留空以及勾选,然后查看一下生成的文件目录有无变化,以此求证。

【gradle】idea+gradle 多模块项目创建教程入门例子

在留空的情况下,编译,部署,观察输出的文件为:
【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

额,上面jsp文件没有,jar编译后的lib也没有,都为空-

那么下面点选
【gradle】idea+gradle 多模块项目创建教程入门例子

然后编译部署看看结果:
【gradle】idea+gradle 多模块项目创建教程入门例子

【gradle】idea+gradle 多模块项目创建教程入门例子

这次算是正常了,所以结论是:
Store generated project files externally 这个选项的意思是,是否将编译好的文件到输出到目标目录下面。
一般情况下,我们配置好的tomcat的网站目录都是
【gradle】idea+gradle 多模块项目创建教程入门例子

这样的目录,一旦设置不输出,那么默认情况下是不可能能够正常运行网站的。

其中一种引起404的问题 — idea默认的application context问题

虽然Store generated project files externally不是引起404的原因,但是受到启发,查看一下部署的设置,结果发现了:
【gradle】idea+gradle 多模块项目创建教程入门例子

看到没有,application context—网站上下文简直乱码一样,于是,改为:
【gradle】idea+gradle 多模块项目创建教程入门例子

好了,重新编译部署,然后可以看到:
【gradle】idea+gradle 多模块项目创建教程入门例子

就是网站上下文context path的问题了。

总结

gradle多模块多项目的创建实际上只是一个基础,以后将用来进行分布式服务提供者程序的开发。

下面放出基本demo例子供下载:
【gradle】idea+gradle 多模块项目创建教程入门例子资源