{"id":13848982,"url":"https://github.com/someok/gradle-multi-project-example","last_synced_at":"2025-04-06T09:08:21.938Z","repository":{"id":12370917,"uuid":"15021960","full_name":"someok/gradle-multi-project-example","owner":"someok","description":"Gradle 多项目管理示例","archived":false,"fork":false,"pushed_at":"2024-01-09T11:01:15.000Z","size":2408,"stargazers_count":292,"open_issues_count":0,"forks_count":117,"subscribers_count":38,"default_branch":"master","last_synced_at":"2025-03-30T08:08:02.309Z","etag":null,"topics":["asciidoc","asciidoctor","gradle","ide","intellij","java"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/someok.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2013-12-08T10:45:39.000Z","updated_at":"2025-03-22T06:15:03.000Z","dependencies_parsed_at":"2024-01-15T20:57:23.581Z","dependency_job_id":"43d2c117-b043-483a-ab11-6e7186498753","html_url":"https://github.com/someok/gradle-multi-project-example","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/someok%2Fgradle-multi-project-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/someok%2Fgradle-multi-project-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/someok%2Fgradle-multi-project-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/someok%2Fgradle-multi-project-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/someok","download_url":"https://codeload.github.com/someok/gradle-multi-project-example/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247457801,"owners_count":20941906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asciidoc","asciidoctor","gradle","ide","intellij","java"],"created_at":"2024-08-04T19:01:04.195Z","updated_at":"2025-04-06T09:08:21.923Z","avatar_url":"https://github.com/someok.png","language":"Java","readme":"# Gradle 多项目管理示例\n\n## v2.0 说明\n\n- 项目结构调整，将子项目迁移到 `modules` 下，取消了 projects 目录\n- 增加了 `build-ext.gradle` 和 `build-lib.gradle` 两个文件，用于存放一些通用的配置\n- 增加了 `gradle.properties` 文件，用于存放一些通用的配置\n- 增加了 `settings.gradle` 文件，用于存放项目的配置\n- `modules:application` 作为项目的启动目录，`modules:core` 作为业务模块，`modules:shared` 作为工具模块，`modules:extra` 作为可选模块\n\n### 目录结构\n```Bash\n./\n├── LICENSE\n├── build-ext.gradle: ext 中定义的一些常用方法\n├── build-lib.gradle: 依赖组件配置\n├── build.gradle: 顶级配置\n├── gradle.properties: group、version 等配置\n├── modules: 项目模块\n│   ├── application: spring boot application\n│   ├── core: 业务模块\n│   ├── extra: 可选模块\n│   └── shared: 工具模块\n└── settings.gradle: 可以在此处修改项目名\n```\n\n----\n\n## v1.0 说明\n\n这个项目用于学习研究 Gradle 的一个测试用例，扔掉也可惜，所以修改了一下放在这儿，如果能对别人有所帮助的话也算是好事一件。\n\n### 为什么用 Gradle\n\n主要还是审美需求。\n\n之前一直用 Ant 来写很多 task 做项目管理，配合 ivy 做依赖管理，不过当项目增多之后这玩意开始力不从心了，多项目采用 Ant 来搞的话有点自虐。\n\n本来打算用 Maven 的，功能确实很强，不过它的依赖管理的写法一直让我有点犯恶心，ivy里面一行语句，丫得三行，看着蛮屏幕的 xml 标签绝对不是什么很愉快的经历。对这东西我这几年基本上是几用几抛。\n\n于是只有 Gradle 这个选择了。\n\n### 主要需求\n\n上面说了，采用这东西其实最主要的还是做**多项目管理**和**jar包依赖管理**，显然这工具在这两方面做的还不赖。\n\n至于其它的一些修改、删除之类的小活就按需添加吧。\n\n### 目录结构说明\n\n#### 顶级目录\n\n放置了一堆 Gradle 的配置文件以及 wrapper 等，为了审美的需要，没把各个子项目放置到这个目录下，专门开辟了个 projects 目录用来存放所有项目。\n\n\u003e 新版本中取消了 projects 目录，将子项目都提升到了根下，当然，原来的配置方式也可以。\n\n#### projects 目录\n\n实际项目存放的地点。\n\n\u003e 可选项，也可以直接将所有子项目放在根目录下，这也是推荐用法。\n\n每个项目都包含了两个子目录：doc、source，前者用来放置文档，后者为源码。\n\n这些项目也可能是来自不同的仓库，例如 git、subversion 等，不同的项目组可能会下载不同的项目于依赖模块，这时候只需要配置一下顶级目录中的 settings.gradle，管理好 include 即可。\n\n### Idea IDE 支持\n\n增加了 Idea 支持，子项目为 Idea 中的 module。并且可以在 module 中忽略某些子项目，例如根项目、projects 等。\n\n![Idea 抓图](static/snapshort.png)\n\n### 内置插件\n\n#### Gradle 自带插件\n\n- 所有子项目\n\t- **eclipse**： 用于生成 eclipse 配置\n\t- **Idea**: 支持 Idea 直接打开项目\n\t- **java**\n- Web 子项目（新增 Task）\n\n\t\u003e 打 war 包的时候版本号做了一些处理，增加了编译数字，例如：project-web.1.1.0.1234.war.\n\n\t- **snapshot**： 用于打 war 包，注意：这儿做了一些处理，war默认打的包带有 SNAPSHOT 后缀\n\t- **release**: 如果想打发布版的 war 包，可采用 gradle release，打开 project-web 的 build.gradle 看看就知道怎么回事了\n\n----------\n\n### 一些小技巧\n\n#### jar 包定义外移\n\n这个是在查找某个问题的时候在一个国外网站（具体哪个忘记了，查的太多也找不到了）发现的。就是将所有的 jar 的定义放置到了 dependencyDefinitions.gradle 中，然后在顶级目录的 build.gradle 中引入：\n\n\u003e apply from: 'dependencyDefinitions.gradle'\n\n该文件内容为：\n\u003cpre\u003e\n ext.versions = [\n     spring: '3.2.5.RELEASE',\n     security: '3.1.4.RELEASE',\n     jackson: '1.9.13',\n     logback: '1.0.13',\n     slf4j: '1.7.5',\n     httpclient: '4.3.1',\n ]\n\n\next.libraries = [\n\t\"servlet-api\": \"javax.servlet:servlet-api:2.5\",\n\t\"jsp-api\": \"javax.servlet:jsp-api:2.0\",\n\n\t\"ebean\": \"org.avaje.ebeanorm:avaje-ebeanorm:3.2.4\",\n\t\"persistence-api\": \"javax.persistence:persistence-api:1.0\",\n\n\t\"aspectjweaver\": \"org.aspectj:aspectjweaver:1.7.4\",\n\t...\n]\n\u003c/pre\u003e\n\n在各个子项目的 build.gradle 中就只需要写 libraries.'ebean' 即可，而不需要把这些jar 散落的到处都是。\n\n将来升级的时候也方便。\n\n#### 善用 gradle dependencies\n\n这个命令可以很方便地检查 jar 的依赖情况，显示的是简单的树形结构，因为在命令行下会显示太多行，所以可以将其输出到一个文本中再看：\n\u003e gradle dependencies \u003e depend.log\n\n通过这个命令我极大简化了我的 ext.libraries 定义，那些自动会依赖的 jar 包就不需要再写了。\n\n#### java 编译时候报编码错误\n\n这是个经典的问题，当然，用了IDE 之后已经见不到此问题，所以在 gradle 编译的时候再次发现此问题的时候都有点故人复见的感觉了。\n\n想当年初学 java 的时候采用命令行编译的诸位应该都会有这个感觉吧。\n\n解决办法很简单，增加一行设置即可：\n\u003e [compileJava, compileTestJava]\\*.options*.encoding = 'UTF-8'\n\n#### 不要定义 group，除非你知道自己在做什么\n\n好吧，其实我到现在还不大清楚 group 的意思是啥，之前我以为跟 \"group 'org.avaje.ebeanorm' module: 'avaje-ebeanorm'\" 的 group 一样，于是就在 build.gradle 中定义 group someok.common\n\n结果在项目编译的时候遇到大量错误，经过艰苦的 debug （可以试试 --debug 就知道为什么说艰苦了）和 dependencies 检测才发现问题可能出在了 group 定义上了，删掉后一切方才圆满。\n\n#### 忽略掉 .gradle 目录\n\n在顶级目录下有个 .gradle 文件夹，这个是 gradle 自动生成的，可以在 git 的 .gitignore 文件中增加一条忽略掉：\n\u003e .gradle/\n\n#### Maven 库中没有的 jar 该怎么管理？\n\n这种情况不多见，但绝对存在。\n\n我的办法是在顶级目录增加一个 libs 文件夹，这个文件夹里面的 jar 是对所有项目都起作用的。\n\n如果是某个项目自用的，则可以在该项目的 source 下面创建个 libs，具体实现是在顶级目录下的 build.gradle 中：\n\u003cpre\u003e\next.jarTree = fileTree(dir: 'libs', include: '**/*.jar')\next.rootProjectLibs = new File(rootProject.rootDir, 'libs').getAbsolutePath()\next.jarTree += fileTree(dir: rootProjectLibs, include: '**/*.jar')\n\ncompile jarTree\n\u003c/pre\u003e\n\n#### 开发环境、生产环境设置\n\nGradle 有几种办法可以用来管理这些设置，例如将配置文件按环境写在 build 文件的不同块中。\n\n不过我的办法是分目录：\n\n- resources： 通用配置放在这儿\n- resources-dev： 开发环境配置\n- resources-prod： 生产环境配置\n\n在用 gradle eclipse 命令生成 IDE 配置的时候，会默认将前两个目录包含在 eclipse 中，只有通过 gradle release 生成 war 包的时候才会忽略 dev，使用 prod。\n\n#### 打包命令\n\n上面已经说过，打 war 包时候有两种方式：\n\n- gradle war： 这个是用来打测试的 war 包，文件后缀增加 **SNAPSHOT**，采用的是 resources-dev。\n- gradle release： 这个才是用来打生产用的 war 包，采用的是 resources-prod。\n\n这是我个人喜好的用法，当然也可以按照自己的喜好来处理了。\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomeok%2Fgradle-multi-project-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsomeok%2Fgradle-multi-project-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomeok%2Fgradle-multi-project-example/lists"}