├── .gitignore ├── 00-00 ├── NullRPException.md ├── README.MD └── ask.png ├── 00-peer └── README.MD ├── 03-buildscript ├── 01-base │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ └── TigerSayHi.java └── 02-extdepend │ ├── build.gradle │ └── src │ └── main │ └── java │ └── TigerSayHi.java ├── 04-repositories ├── README.MD └── build.gradle ├── 05-dependencies ├── 01-depbase │ ├── README.md │ ├── build.gradle │ ├── settings.gradle │ └── src │ │ └── main │ │ └── java │ │ └── TigerSayHi.java ├── 02-local-dependency │ ├── build.gradle │ └── src │ │ └── main │ │ └── resources │ │ └── basefile ├── 03-ptj │ ├── README.md │ ├── binary.gradle │ ├── build.gradle │ ├── gradle.properties │ ├── settings.gradle │ └── src │ │ └── main │ │ └── java │ │ └── Tiger.java ├── 04-deptree │ ├── README.MD │ └── build.gradle ├── 05-gradleCacheHome │ ├── README.md │ └── build.gradle ├── 06-moduleVersion │ ├── README.md │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ └── TigerSayHi.java ├── 07-transitive │ ├── README.MD │ └── build.gradle ├── 08-clientModule │ ├── build.gradle │ └── src │ │ └── main │ │ └── resources │ │ └── basefile └── 09-publish │ ├── build.gradle │ └── src │ └── main │ └── java │ └── Tiger.java ├── 06-task ├── 01-task │ └── build.gradle ├── 02-action │ └── build.gradle ├── 03-depends │ └── build.gradle ├── 04-skip │ └── build.gradle ├── 05-dynamic │ └── build.gradle ├── 06-inbuild │ └── build.gradle └── 07-customTask │ ├── build.gradle │ └── buildSrc │ └── src │ └── main │ └── groovy │ └── org.pkaq │ └── Hello.groovy ├── 07-plugin ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── groovy │ └── org.pkaq │ │ ├── FoLengPlugin.groovy │ │ ├── FoLengTask.groovy │ │ └── FolengExtension.groovy │ └── resources │ └── META-INF │ └── gradle-plugins │ └── org.pkaq.foLeng.properties ├── 07-properties ├── README.md ├── build.gradle ├── gradle.properties └── src │ └── main │ └── resources │ └── jdbc.txt ├── 08-sourceset ├── README.MD ├── build.gradle └── src │ └── xxx │ └── java │ ├── Tiger.java │ ├── config │ └── mybatis │ │ └── mybatis.xml │ ├── lm.jpg │ └── prop │ └── config.properties ├── 09-multi-project ├── 01-multi-project │ ├── README.md │ ├── base │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── basefile │ ├── build.gradle │ ├── pic.jpg │ ├── settings.gradle │ ├── weball │ │ └── weball │ │ │ ├── build.gradle │ │ │ └── build │ │ │ └── tmp │ │ │ └── war │ │ │ └── MANIFEST.MF │ ├── webapp │ │ ├── build.gradle │ │ ├── build │ │ │ └── tmp │ │ │ │ └── war │ │ │ │ └── MANIFEST.MF │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── webapp │ ├── webcore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── webcore │ └── webmanagement │ │ ├── build.gradle │ │ ├── build │ │ └── tmp │ │ │ └── war │ │ │ └── MANIFEST.MF │ │ └── src │ │ └── main │ │ └── resources │ │ └── webmanagement ├── 02-multi-project-springboot │ ├── README.md │ ├── build.gradle │ ├── settings.gradle │ ├── webpage │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── resources │ │ │ ├── static │ │ │ └── duke.jpg │ │ │ └── web │ │ │ └── tiger.jsp │ └── webserver │ │ ├── build.gradle │ │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── pkaq │ │ │ ├── Booter.java │ │ │ └── web │ │ │ └── controller │ │ │ └── TigerCtrl.java │ │ └── resources │ │ └── application.yaml ├── 03-multi-project-flat │ ├── README.md │ ├── base │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── basefile │ └── main │ │ ├── build.gradle │ │ ├── settings.gradle │ │ └── src │ │ └── main │ │ └── resources │ │ └── webapp ├── 04-multi-project-central │ ├── README.md │ ├── base │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── basefile │ ├── build.gradle │ ├── main │ │ └── src │ │ │ └── main │ │ │ └── resources │ │ │ └── webapp │ └── settings.gradle └── 05-multi-project-centraldep │ ├── README.md │ ├── build.gradle │ ├── settings.gradle │ ├── webpage │ ├── build.gradle │ └── src │ │ └── main │ │ └── resources │ │ └── META-INF │ │ └── resources │ │ ├── static │ │ └── duke.jpg │ │ └── web │ │ └── tiger.jsp │ └── webserver │ ├── build.gradle │ └── src │ └── main │ ├── java │ └── org │ │ └── pkaq │ │ ├── Booter.java │ │ └── web │ │ └── controller │ │ └── TigerCtrl.java │ └── resources │ └── application.yaml ├── 10-unicode ├── README.MD ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── java │ └── Tiger.java │ └── resources │ └── 心有猛虎,细嗅蔷薇.txt ├── 11-resources ├── README.MD ├── build.gradle └── src │ └── main │ └── java │ ├── Tiger.java │ ├── config │ └── mybatis │ │ └── mybatis.xml │ ├── lm.jpg │ └── prop │ └── config.properties ├── 12-specifyName ├── README.MD ├── build.gradle └── src │ └── main │ └── java │ └── Tiger.java ├── 13-env ├── 01-folder │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── java │ │ └── Tiger.java │ │ └── resources │ │ ├── dev │ │ └── dev.properties │ │ └── pro │ │ └── pro.properties ├── 02-configfile │ ├── README.MD │ ├── build.gradle │ ├── config.groovy │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── java │ │ └── Tiger.java │ │ └── resources │ │ ├── application.xml │ │ └── prop │ │ └── init.properties └── README.MD ├── 14-lifecycle ├── README.md ├── base │ └── src │ │ └── main │ │ └── resources │ │ └── basefile ├── build.gradle ├── gradle.properties ├── main │ └── src │ │ └── main │ │ └── resources │ │ └── webapp └── settings.gradle ├── 15-kotlin └── 00-spring_boot │ ├── README.MD │ ├── build.gradle │ └── src │ └── main │ ├── kotlin │ └── org │ │ └── pkaq │ │ └── Booter.kt │ ├── resources │ └── application.yaml │ └── webapp │ └── web │ └── index.jsp ├── 16-plugin-java └── 0-fatjar │ ├── README.MD │ ├── build.gradle │ └── src │ └── main │ └── java │ └── Tiger.java ├── 17-plugin-checkstyle ├── CheckStyle.xml ├── build.gradle └── src │ └── main │ └── java │ └── Tiger.java ├── 18-plugin-pmd ├── 00.pmd │ ├── build.gradle │ └── src │ │ └── main │ │ └── java │ │ └── Tiger.java └── 01.alipmd │ ├── build.gradle │ └── src │ └── main │ └── java │ └── Tiger.java ├── 19-plugin-jib ├── README.MD ├── build.gradle └── src │ └── main │ └── java │ └── TigerSayHi.java ├── 20-plugin-proguard ├── README.md ├── assets │ └── proguard.png ├── build.gradle ├── settings.gradle ├── webpage │ ├── build.gradle │ └── src │ │ └── main │ │ └── resources │ │ └── META-INF │ │ └── resources │ │ ├── static │ │ └── duke.jpg │ │ └── web │ │ └── tiger.jsp └── webserver │ ├── Shakespeare..txt │ ├── build.gradle │ ├── compact.txt │ ├── directory.txt │ ├── keywords.txt │ ├── proguard-rules.pro │ ├── src │ └── main │ │ ├── java │ │ └── org │ │ │ └── pkaq │ │ │ ├── Booter.java │ │ │ └── web │ │ │ └── controller │ │ │ └── TigerCtrl.java │ │ └── resources │ │ └── application.yaml │ └── windows.txt ├── LICENSE ├── README.md └── ask.png /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /ptj/ptj.iml 3 | /ptj/.gradle 4 | /ptj/build 5 | -------------------------------------------------------------------------------- /00-00/NullRPException.md: -------------------------------------------------------------------------------- 1 | 问完问题就跑且无致谢 290**007/zy @ce-service.com.cn 1521**8256@163.com 2 | 3 | 294329996 -------------------------------------------------------------------------------- /00-00/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### 群规 3 | 4 | 本群非百度知道、非新人救助站以及新兵辅导营 5 | 6 | 入群请在昵称前注明主攻方向/语言的首字母 7 | 8 | 如 9 | - Android -> A 10 | - JavaEE -> J 11 | - Groovy -> G 12 | - Kotlin -> K 13 | - Android & JavaEE -> AJ 14 | 15 | 16 | # 入门必读 17 | 为森么此章使用了一号标题 我想你已经明白了吧 18 | 19 | 新手入门请先阅读如下链接补充基础, 尤其是示例大全里的示例 会满足你绝大多数应用场景: 20 | 21 | 22 | 0.**[groovy基础语法]**: http://ifeve.com/groovy-syntax/ 23 | 24 | 1.**[gradle-实战文章]**: http://www.jianshu.com/c/9e24d4c23a84 25 | 26 | 2.**[gradle示例]**: http://github.com/gradlecn/gradleside 27 | 28 | 29 | > 强烈推荐阅读 [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way)、[《如何向开源社区提问题》](https://github.com/seajs/seajs/issues/545) 和 [《如何有效地报告 Bug》](http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html)、[《如何向开源项目提交无法解答的问题》](https://zhuanlan.zhihu.com/p/25795393),更好的问题更容易获得帮助。 30 | 31 | 32 | 本群为 **非盈利** 民间组织 !!!!!! 33 | 本群为 **非盈利** 民间组织 !!!!!! 34 | 本群为 **非盈利** 民间组织 !!!!!! 35 | 36 | 37 | 提问是你的权利 别人是否愿意回答是别人的权利 38 | 你可以不赞同所有人的沉默 但请尊重他人沉默的权利 39 | 40 | 大爷请绕道 41 | 当然认为本群规吹毛求疵 是在故作高冷的也请绕道 42 | 43 | 特别提示: 群主不接受一切免费/付费(看心情)一对一咨询,有问题请直接群里抛出或者本地址提交issuse 44 | 45 | ### 关于提问 46 | - 请谦虚发问,礼貌回答。 47 | - 提问时请详细描述问题原因,你的目的,你已经做了哪些尝试,目前的错误信息 48 | - 如果需要发代码以及错误信息请采用截图方式发出 49 | - 先自查 后发问 勿做伸手党。 50 | 51 | 52 | ### 关于日常 53 | - 请勿在本群长时间、大量吹水 54 | - 请勿在本群斗图、超过窗口半屏的非提问问题图不要发 55 | - 本群不讨论任何政治、宗教、信仰、民族、地域、PHP等易发冲突话题 56 | 57 | ### 关于吹水 58 | 适度吹水益脑,沉迷吹水伤身。 59 | 合理安排时间,享受健康生活。 60 | 61 | 当然 如果你实在对 吹水\撕逼\斗图 乐此不疲又欲罢不能 , 欢迎加入 **`576648359`** 群进行愉快地交谈. 62 | 63 | 64 | 65 | 66 | **** 67 | ### 提问准备 68 | 69 | 70 | - 仔细阅读 !!!!!!!【**[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)**】!!!!!! 71 | - 仔细阅读 !!!!!!!【**[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)**】!!!!!! 72 | - 仔细阅读 !!!!!!!【**[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)**】!!!!!! 73 | 74 | 75 | - 仔细阅读 !!!!!!!【**[提问的智慧 - 注解版 ](https://hacpai.com/article/1536377163156)**】!!!!!! 76 | - 仔细阅读 !!!!!!!【**[提问的智慧 - 注解版](https://hacpai.com/article/1536377163156)**】!!!!!! 77 | - 仔细阅读 !!!!!!!【**[提问的智慧 - 注解版](https://hacpai.com/article/1536377163156)**】!!!!!! 78 | 79 | 80 | - 官方文档 81 | 官方文档永远是你找答案的最佳方式,尤其是`gradle`的官方文档,已经详尽到令人想吐的地步 82 | - 民间示例 83 | 请确保你已经阅读了入门必读的三个链接 84 | - 善用搜索引擎 85 | 有梯子用`google`,没梯子用`bing`,实在不行用百度 86 | - stackoverflow 87 | 首选stackoverflow,次选segmentfault,不用担心你的英文,你的汉语+对应单词拼接 能懂的老外大部分情况下还是 88 | 89 | 90 | 91 | ### 提问礼节 92 | 93 | - **平和** 94 | - **谦虚** 95 | - **礼貌** 96 | 97 | 尊重他人就是尊重自己 98 | 99 | 欲要提问,必先保持平和.本君当然知道很多来提问的同学,多数情况下是由于手头工作遇到了xx困难前来提问,尤其是手头任务已经延期的情况下,火急火燎的有,气急败坏的有,来寻一颗稻草颓丧至极的也有.不过切记,这些情绪与你的问题无关,更与你即将寻求帮助的人无关,所以抛开这些情绪,去描述你的问题,寻求帮助会得到更有效和更多的应答. 100 | 101 | 当然,除非你加的是付费回答的群组,普世民间社团往往是由兴趣、需求等自行聚集的一众散仙,既然是来寻求帮助,请保持人与人之间的基本交往礼仪,现实世界的礼节到了虚拟世界也是同样适用的,提问是你的权利 别人是否愿意回答是别人的权利 你可以不赞同所有人的沉默 但请尊重他人沉默的权利 102 | 103 | 举个栗子.下雨天,小明在街上没带伞,这时候小明看到街上有人有一把伞,有的有两把伞,于是小明冲上去说,`我没伞!!!`,大雄侧目而过,又冲上去说,`我没伞,给我把伞`,静香只留下一句`蛇精病`,又冲上去说,`我没伞啊,你有两把怎么不给我把伞呢??!!`,终于得到了胖虎一顿胖揍,最后终于看到一个有好多伞的大叔,跪下说`大叔,我没伞,跪求一把伞`,大叔开口说`嘿嘿,你要20的还是30的?`. 104 | 105 | 上面的小明,在不同的几个阶段对应了不同的提问者类型: 106 | 107 | - **丐帮** 108 | 此类提问者,通常把自己置于地表,如`跪求xxxx` 109 | - **太子党** 110 | 此类提问者,通常用词狂放,如`这个xxx不行,看下` 111 | - **巫妖王** 112 | 此类提问者,通常语气面如冰霜,发问往往不带任何语气, 如`xxx 报错,为什么` ,通常还附带得到解决后就消失的特效 113 | - **炸弹魔** 114 | 此类提问者,一点就炸,尽量远离,如`破群,怎么没人回答`,`我要是那么行还来问你?` 115 | 116 | 少用感叹号和反问句,这会增加你与陌生人接触时的好感,毕竟`我又不认识你 你对我吼啥`基本是全人类共识. 117 | 118 | 119 | 当然,在每个人都在忙于工作、学习的情况下,你礼貌的抛出来的问题也可能全然没有任何响应,没人响应往往是由于如下情况: 120 | 121 | - 看到了,不会 122 | - 看到了,码完砖在告诉你 123 | - 没看到,在码砖 124 | - 没看到,不是常用群,已设置(来消息不通知 || 收进群助手) 125 | - 百度一大坨,你做了伸手党 126 | - 没有注意提问的礼节,就是不想搭理你 127 | 128 | 此时,颓丧人格的同学极易转化为气急败坏型人格,`我是来求救的,你们怎么能不帮我呢`;这里想说的是,同学你的KPI跟别人无关,你总不能对着世界喊,`劳资要穷死了`然后没人给你钱你就骂街吧?往好了说这叫`情绪管理`或者说叫`心态`,往大了说这也体现了一个人的素养,尊重他人就是尊重自己. 129 | 130 | ### 提问技巧 131 | 132 | - **标题明确** 133 | 使用简洁明确的标题,描述的你问题,不要夸张,不要做作,更不要笼统 134 | > 弱弱的问一句,xxxx 135 | > 编译报错,为神马 136 | - **描述问题** 137 | 描述问题的事实,并且不要附加太多情绪特效,并且保持格式清晰,如果你在群里用文本贴了100行代码,那么多半没人会愿意看.这里需要注意的是 138 | - 准确表达你的目标,或许当前的bug正是由于你采用了一个不恰当的方案 139 | - 先实现一个小目标,当然,你不能上来就提问`如何开发一个操作系统`,请保证至少你已经做了部分尝试,并且是尝试中遇到的具体问题 140 | - 贴出关键信息,贴出报错的关键信息,不要无脑全贴,也不要无脑只贴一个红x 141 | - 描述你的场景,包括你的运行环境,配置,甚至业务场景 142 | - 描述你的尝试,你尝试了哪些,得到了怎样的结果 143 | 这里建议部分参考5W1H方法,会对你的提问有所裨益 144 | 145 | 146 | 这其实是一种沟通谈话技巧,强烈案例一波《非暴力沟通》,这本书讲述了非暴力沟通的四要素,观察、感受、需求、请求 147 | 放到提问层面即是 148 | - 观察:客观描述你所遭遇的问题,陈述事实\现象,去掉各种形容词以及主观评价或臆断. 149 | - 感受:描述这个客观事实导致了怎样的后果 150 | - 需求:描述自己的目的和需要,即你要达成的最终目标 151 | - 请求:你想得到怎样的帮助或者哪方面的帮助 152 | 153 | ### 闲寂古池旁, 青蛙跳进水中央, 扑通一声响 154 | 155 | 有人来无偿回答你的问题,无论是否解决了你的问题都已经付出了时间成本,若是把这种行为当做是一种自我实现的话,显然要想得到这种自我实现的回应首先应该使义务回答人得到受尊重的认同感。 156 | 157 | 或许提供的方案解决的你的问题,或许未解决,甚至有的方案把你带跑偏了,此时切记莫要丢掉内心的平和.因为无论结果如何,别人已经为你付出了时间成本,不要忘记感谢和总结. 158 | 159 | 或许所有的方案都未解决你的问题,你自己找到了方案,如果你喜欢,欢迎分享,毕竟`送人玫瑰,手有余香`. 160 | 或许有的方案与你的问题互相背离,请淡定的再看一下自己的发问是否提供了准确清晰的描述和足够的问题判断信息. 161 | 或许刚提问就有人给了现成的解决方案,那么`闲寂古池旁, 青蛙跳进水中央, 扑通一声响`,请不要忘了留一句`谢谢,好使` 162 | 163 | 说到这里,作为提问者,可能会问,我跳到群里提问,为什么没有扑通,烦请参看`提问礼节`小节,还有人会说,既然沉默是你们的权力,那么骂街也是我的权力,诚然这句话是没有错误的,但是常识告诉我们,行驶权力的同时请不要影响他人,毕竟骂街也是违反治安处罚条例的. 164 | 165 | 166 | p.s: 做一个会倾听的提问者 167 | 168 | 很多提问者遇到问题提问时标题明确,内容丰富,代码清晰。可是就是不听人言,一味只顾陈述自己的问题和困难,对于潜在回答者想要了解的细节反问或者简短建议直接自动忽略,这很容易让你失去潜在的帮助。 169 | -------------------------------------------------------------------------------- /00-00/ask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/00-00/ask.png -------------------------------------------------------------------------------- /00-peer/README.MD: -------------------------------------------------------------------------------- 1 | ### peer not authenticated 2 | 3 | ### 请翻墙 4 | ### 请翻墙 5 | ### 请翻墙 6 | 7 | ### 翻墙教程: [http://pkaq.org/2018/02/09/gfw/](http://pkaq.org/2018/02/09/gfw/) -------------------------------------------------------------------------------- /03-buildscript/01-base/README.md: -------------------------------------------------------------------------------- 1 | 这是一个简单的脚本示例 2 | -------------------------------------------------------------------------------- /03-buildscript/01-base/build.gradle: -------------------------------------------------------------------------------- 1 | //应用插件 2 | apply plugin: 'java' 3 | //定义扩展属性(可选) 4 | ext { 5 | foo="foo" 6 | } 7 | //定义局部变量(可选) 8 | def bar="bar" 9 | 10 | //修改项目属性(可选) 11 | group 'pkaq' 12 | version '1.0-SNAPSHOT' 13 | 14 | //定义仓库 15 | repositories { 16 | jcenter() 17 | } 18 | 19 | //定义依赖 20 | dependencies { 21 | compile "cn.pkaq:ptj.tiger:+" 22 | } 23 | 24 | //自定义任务(可选) 25 | task printFoobar { 26 | println "${foo}__${bar}" 27 | } -------------------------------------------------------------------------------- /03-buildscript/01-base/src/main/java/TigerSayHi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Leon on 2015/12/14. 3 | */ 4 | public class TigerSayHi { 5 | public static void main(String[] args) { 6 | Tiger.sayHi(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /03-buildscript/02-extdepend/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | jcenter() 4 | } 5 | dependencies { 6 | classpath 'cn.pkaq:ptj.tiger:0.1.0' 7 | classpath group: 'org.apache.commons', name: 'commons-lang3', version: '3.6' 8 | } 9 | } 10 | 11 | import org.apache.commons.lang3.StringUtils; 12 | 13 | task x { 14 | def sb=" " 15 | def sb_bravo =" - _____ - |||| " 16 | 17 | println sb_bravo 18 | println StringUtils.isEmpty(sb) 19 | println StringUtils.isBlank(sb) 20 | 21 | println Tiger.sayHi() 22 | } 23 | 24 | -------------------------------------------------------------------------------- /03-buildscript/02-extdepend/src/main/java/TigerSayHi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Leon on 2015/12/14. 3 | */ 4 | public class TigerSayHi { 5 | public static void main(String[] args) { 6 | Tiger.sayHi(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /04-repositories/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### Gradle仓库管理 3 | 4 | 各种仓库 5 | 本地缓存 6 | 中央仓库 7 | jcenter 8 | maven私服 9 | 带权限的maven私服 10 | 文件夹 11 | ivy仓库 12 | 一坨 13 | 14 | 需要注意的是:如果使用maven本地缓存的话,在maven配置了环境的情况下,由maven安装目录中配置的setting.xml(localRepository节点)中指定,没有的话默认从用户目录的.m2中读取 15 | 16 | [最后更新日期:2018/09/10]:下面是收集的一些常用库 17 | ```groovy 18 | //使用Maven本地缓存 19 | mavenLocal() 20 | 21 | //使用jcenter 22 | jcenter() 23 | 24 | //使用中央仓库 25 | mavenCentral() 26 | 27 | //使用开源中国的maven库,此库经常间歇性地域性歇菜 28 | maven { 29 | url "http://maven.oschina.net/content/groups/public/" 30 | name = "开源中国的maven库" 31 | } 32 | 33 | //使用spring的maven库,name是可选的 我也可以不指定name 34 | maven { url"https://repo.spring.io/libs-release" } 35 | 36 | 37 | maven { 38 | url "http://maven.aliyun.com/nexus/content/groups/public/" 39 | name = "阿里云" 40 | } 41 | 42 | maven { 43 | url "https://mirrors.huaweicloud.com/repository/maven/" 44 | name = "华为开源镜像库" 45 | } 46 | 47 | maven { 48 | url "http://uk.maven.org/maven2/" 49 | name = "maven uk" 50 | } 51 | 52 | maven { 53 | url "http://mirrors.ibiblio.org/maven2/" 54 | name = "中国软件开发网" 55 | } 56 | 57 | maven { 58 | url "http://repository.jboss.org/nexus/content/groups/public/" 59 | name = "jboss" 60 | } 61 | 62 | maven { 63 | url "https://repository.jboss.org/nexus/content/repositories/releases/" 64 | name = "jbossJBPM" 65 | } 66 | 67 | maven { 68 | url "http://maven.antelink.com/content/repositories/central/" 69 | name = "antepedia" 70 | } 71 | 72 | maven { 73 | url "http://mavensync.zkoss.org/maven2/" 74 | name = "zkoss" 75 | } 76 | 77 | ``` -------------------------------------------------------------------------------- /04-repositories/build.gradle: -------------------------------------------------------------------------------- 1 | //Gradle 1.8+ 2 | repositories { 3 | //使用Maven本地缓存 4 | mavenLocal() 5 | 6 | //使用jcenter 7 | jcenter() 8 | 9 | //使用中央仓库 10 | mavenCentral() 11 | 12 | //使用开源中国的maven库 13 | maven { 14 | url "http://maven.oschina.net/content/groups/public/" 15 | name = "开源中国的maven库" 16 | } 17 | 18 | //使用spring的maven库,name是可选的 我也可以不指定name 19 | maven { url"https://repo.spring.io/libs-release" } 20 | 21 | 22 | //使用maven仓库,什么?有权限控制? 23 | maven { 24 | url 'http://my.server/' 25 | credentials { 26 | username = 'username' 27 | password = 'password' 28 | } 29 | } 30 | //使用ivy仓库 31 | ivy { 32 | artifactPattern '/some/dir/[organisation]/[module]-[revision].[ext]' 33 | } 34 | 35 | //恩。。。使用文件夹做仓库 36 | flatDir name: 'libs', dirs: "$projectDir/libs" 37 | //当然 。。。 也可以指定多个 38 | flatDir { 39 | dirs '../project-files', '/volumes/shared-libs' 40 | name = '这个也是可以指定name的' 41 | } 42 | 43 | //写在最后,没错 你看到了 可以添加多个,这就是添加多个仓库的方式 44 | } -------------------------------------------------------------------------------- /05-dependencies/01-depbase/README.md: -------------------------------------------------------------------------------- 1 | 这是一个简单的依赖引用示例 2 | 引用的jar包为ptj项目(使用gradle发布自己的项目到jcenter)中发布的项目~ 3 | -------------------------------------------------------------------------------- /05-dependencies/01-depbase/build.gradle: -------------------------------------------------------------------------------- 1 | group 'pkaq' 2 | version '1.0-SNAPSHOT' 3 | 4 | apply plugin: 'java' 5 | 6 | repositories { 7 | jcenter() 8 | } 9 | 10 | dependencies { 11 | compile "cn.pkaq:ptj.tiger:+" 12 | } 13 | -------------------------------------------------------------------------------- /05-dependencies/01-depbase/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'depbase' 2 | 3 | -------------------------------------------------------------------------------- /05-dependencies/01-depbase/src/main/java/TigerSayHi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Leon on 2015/12/14. 3 | */ 4 | public class TigerSayHi { 5 | public static void main(String[] args) { 6 | Tiger.sayHi(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /05-dependencies/02-local-dependency/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin : 'war' 2 | dependencies { 3 | compile fileTree(dir:'libs',include:'spring*.jar',exclude:'hibernate*.jar') 4 | } -------------------------------------------------------------------------------- /05-dependencies/02-local-dependency/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/05-dependencies/02-local-dependency/src/main/resources/basefile -------------------------------------------------------------------------------- /05-dependencies/03-ptj/README.md: -------------------------------------------------------------------------------- 1 | 这是一个使用gradle上传到Jcenter的一个示例 2 | 具体步骤 这里写的已经非常明白了 并且提供了多个示例 3 | https://github.com/bintray/gradle-bintray-plugin 4 | 5 | 6 | ------- 7 | 上传到jcenter至少需要四个文件,除了打包的jar之外, 8 | 还需要pom和javadoc,source,否则是通不过jcenter审核的。 9 | 10 | ------- 11 | 12 | 下面是博客引文 13 | 有时你或许会想发布自己的项目到jcenter来供大家采用gav的形式引用 14 | 辣么接下来就是告诉你如何发布自己的项目到jcenter 15 | 什么是 Jcenter :Forget about Maven Central 16 | 17 | 18 | ####版本信息 19 | JDK : 1.8 20 | Gradle : 2.9 21 | 22 | 23 | ####1、前期准备 24 | 首先你得去[Bintray官方网站](https://bintray.com/)去注册一个账号 25 | 注册完成后点击编辑Profile获取你的API key 26 | ####2、编写脚本 27 | 28 | 29 | 因为正常情况下build.gradle还要做一些其它事情,而这里上传的脚本又比较长所以独立出来。 30 | 31 | ######build.gradle 32 | 33 | Gradle 2.1+写法: 34 | ```groovy 35 | plugins { 36 | id "com.jfrog.bintray" version "1.4" 37 | } 38 | //你的bintray.gradle的相对路径 39 | apply from: 'binary.gradle' 40 | ``` 41 | 42 | Gradle 2.1-写法: 43 | ```groovy 44 | buildscript { 45 | repositories { 46 | jcenter() 47 | } 48 | dependencies { 49 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' 50 | } 51 | } 52 | //你的bintray.gradle的相对路径 53 | apply from: 'binary.gradle' 54 | ``` 55 | gradle.properties 56 | ```groovy 57 | #JCENTER用户名和API key 58 | BINTRAY_USER= 59 | BINTRAY_APIKEY= 60 | 61 | #GAV 62 | GROUP=cn.pkaq 63 | ARTIFACT_ID=ptj.tiger 64 | VERSION_NAME=0.1.0 65 | 66 | #项目地址相关 67 | POM_URL=http://pkaq.github.io 68 | POM_SCM_URL=https://github.com/pkaq/GradleSide 69 | POM_SCM_CONNECTION=git@github.com:pkaq/GradleSide.git 70 | POM_SCM_DEV_CONNECTION=git@github.com:pkaq/GradleSide.git 71 | #项目相关信息 72 | GIT_URL=https://github.com/pkaq/GradleSide.git 73 | ISSUE_URL=https://github.com/pkaq/GradleSide/issues 74 | 75 | POM_PACKAGING=jar 76 | POM_DESCRIPTION=Tiger say hi~ 77 | 78 | #开源协议 79 | POM_LICENCE_NAME=The Apache Software License, Version 2.0 80 | POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt 81 | POM_LICENCE_DIST=repo 82 | 83 | #开发者信息 84 | POM_DEVELOPER_ID=pkaq 85 | POM_DEVELOPER_NAME=Frank.W 86 | POM_DEVELOPER_EMAIL=pkaq@msn.com 87 | POM_DEVELOPER_URL=http://pkaq.github.io 88 | 89 | 90 | ``` 91 | 92 | ######binary.gradle 93 | ```groovy 94 | //上传到jcenter至少需要四个文件,除了打包的jar之外, 95 | //还需要pom和javadoc,source,否则是通不过jcenter审核的。 96 | apply plugin: 'maven-publish' 97 | apply plugin: 'com.jfrog.bintray' 98 | apply plugin: 'java' 99 | 100 | group = GROUP 101 | version = VERSION_NAME 102 | 103 | def getBintrayUserProperty() { 104 | return hasProperty('BINTRAY_USER') ? BINTRAY_USER : "" 105 | } 106 | 107 | def getBintrayApiKeyProperty() { 108 | return hasProperty('BINTRAY_APIKEY') ? BINTRAY_APIKEY : "" 109 | } 110 | 111 | //根据jcenter的审核要求 必须包含sourceJar和docJar 112 | task sourceJar(type: Jar) { 113 | from sourceSets.main.allSource 114 | classifier = 'sources' 115 | } 116 | 117 | task javadocJar(type: Jar, dependsOn: javadoc) { 118 | classifier = 'javadoc' 119 | from javadoc.destinationDir 120 | } 121 | publishing { 122 | publications { 123 | mavenJava(MavenPublication) { 124 | //GAV配置 125 | groupId GROUP 126 | artifactId ARTIFACT_ID 127 | version VERSION_NAME 128 | 129 | from components.java 130 | artifact sourceJar 131 | artifact javadocJar 132 | 133 | //pom相关信息 134 | pom.withXml { 135 | Node root = asNode() 136 | root.appendNode('name', ARTIFACT_ID) 137 | root.appendNode('description', POM_DESCRIPTION) 138 | root.appendNode('url', POM_URL) 139 | 140 | def issues = root.appendNode('issueManagement') 141 | issues.appendNode('system', 'github') 142 | issues.appendNode('url', ISSUE_URL) 143 | 144 | def scm = root.appendNode('scm') 145 | scm.appendNode('url', POM_SCM_URL) 146 | scm.appendNode('connection', POM_SCM_CONNECTION) 147 | scm.appendNode('developerConnection', POM_SCM_DEV_CONNECTION) 148 | 149 | def license = root.appendNode('licenses').appendNode('license') 150 | license.appendNode('name', POM_LICENCE_NAME) 151 | license.appendNode('url', POM_LICENCE_URL) 152 | license.appendNode('distribution', POM_LICENCE_DIST) 153 | } 154 | } 155 | } 156 | } 157 | // gradle bintrayUpload 158 | bintray { 159 | user = getBintrayUserProperty() 160 | key = getBintrayApiKeyProperty() 161 | publications = ['mavenJava'] 162 | // configurations = ['archives'] 163 | dryRun = false 164 | publish = true 165 | pkg { 166 | //你在bintray建立的仓库类型 167 | repo = 'maven' 168 | //包名 169 | name = ARTIFACT_ID 170 | //描述 171 | desc = POM_DESCRIPTION 172 | //站点地址 173 | websiteUrl = POM_URL 174 | //缺陷提交地址 175 | issueTrackerUrl = ISSUE_URL 176 | //版本库地址 177 | vcsUrl = GIT_URL 178 | //许可证 179 | licenses = ['Apache-2.0'] 180 | labels = ['gradle', 'tiger'] 181 | publicDownloadNumbers = true 182 | 183 | version { 184 | //版本号 185 | name = VERSION_NAME 186 | //版本描述 187 | desc = POM_DESCRIPTION 188 | } 189 | } 190 | } 191 | ``` 192 | ####3、提交待审 193 | 调用bintrayUpload上传到Jcenter 194 | ```shell 195 | gradle -q bU 196 | ``` 197 | 198 | 当bintrayUpload成功之后, 199 | 200 | 在我的主页https://bintray.com/{your_username}右下部分Latest Activity块,会看到你提交了一个项目, 201 | 从这个Latest Activity列表中点击你的项目, 202 | 进入详情页https://bintray.com/{your_username}/maven/lesscode-core/view, 203 | 找到Maven Central标签, 204 | 鼠标放上去它会提示你去提交审核,"To be synced to Maven Central your package needs to be included in the JCenter repository. Click here to get it included." 205 | 点击进入后,随便写什么都可以了。 206 | 过审之后在Linked to下面就可以看到多了个Jcenter xxx了 207 | 208 | 209 | P.S:bintray所有的删除操作都是在edit界面里。 -------------------------------------------------------------------------------- /05-dependencies/03-ptj/binary.gradle: -------------------------------------------------------------------------------- 1 | //上传到jcenter至少需要四个文件,除了打包的jar之外, 2 | //还需要pom和javadoc,source,否则是通不过jcenter审核的。 3 | apply plugin: 'maven-publish' 4 | apply plugin: 'com.jfrog.bintray' 5 | apply plugin: 'java' 6 | 7 | group = GROUP 8 | version = VERSION_NAME 9 | 10 | def getBintrayUserProperty() { 11 | return hasProperty('BINTRAY_USER') ? BINTRAY_USER : "" 12 | } 13 | 14 | def getBintrayApiKeyProperty() { 15 | return hasProperty('BINTRAY_APIKEY') ? BINTRAY_APIKEY : "" 16 | } 17 | 18 | //根据jcenter的审核要求 必须包含sourceJar和docJar 19 | task sourceJar(type: Jar) { 20 | from sourceSets.main.allSource 21 | classifier = 'sources' 22 | } 23 | 24 | task javadocJar(type: Jar, dependsOn: javadoc) { 25 | classifier = 'javadoc' 26 | from javadoc.destinationDir 27 | } 28 | publishing { 29 | publications { 30 | mavenJava(MavenPublication) { 31 | //GAV配置 32 | groupId GROUP 33 | artifactId ARTIFACT_ID 34 | version VERSION_NAME 35 | 36 | from components.java 37 | artifact sourceJar 38 | artifact javadocJar 39 | 40 | //pom相关信息 41 | pom.withXml { 42 | Node root = asNode() 43 | root.appendNode('name', ARTIFACT_ID) 44 | root.appendNode('description', POM_DESCRIPTION) 45 | root.appendNode('url', POM_URL) 46 | 47 | def issues = root.appendNode('issueManagement') 48 | issues.appendNode('system', 'github') 49 | issues.appendNode('url', ISSUE_URL) 50 | 51 | def scm = root.appendNode('scm') 52 | scm.appendNode('url', POM_SCM_URL) 53 | scm.appendNode('connection', POM_SCM_CONNECTION) 54 | scm.appendNode('developerConnection', POM_SCM_DEV_CONNECTION) 55 | 56 | def license = root.appendNode('licenses').appendNode('license') 57 | license.appendNode('name', POM_LICENCE_NAME) 58 | license.appendNode('url', POM_LICENCE_URL) 59 | license.appendNode('distribution', POM_LICENCE_DIST) 60 | } 61 | } 62 | } 63 | } 64 | // gradle bintrayUpload 65 | bintray { 66 | user = getBintrayUserProperty() 67 | key = getBintrayApiKeyProperty() 68 | publications = ['mavenJava'] 69 | // configurations = ['archives'] 70 | dryRun = false 71 | publish = true 72 | pkg { 73 | //你在bintray建立的仓库类型 74 | repo = 'maven' 75 | //包名 76 | name = ARTIFACT_ID 77 | //描述 78 | desc = POM_DESCRIPTION 79 | //站点地址 80 | websiteUrl = POM_URL 81 | //缺陷提交地址 82 | issueTrackerUrl = ISSUE_URL 83 | //版本库地址 84 | vcsUrl = GIT_URL 85 | //许可证 86 | licenses = ['Apache-2.0'] 87 | labels = ['gradle', 'tiger'] 88 | publicDownloadNumbers = true 89 | 90 | version { 91 | //版本号 92 | name = VERSION_NAME 93 | //版本描述 94 | desc = POM_DESCRIPTION 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /05-dependencies/03-ptj/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.jfrog.bintray" version "1.4" 3 | } 4 | //你的bintray.gradle的相对路径 5 | apply from: 'binary.gradle' 6 | 7 | -------------------------------------------------------------------------------- /05-dependencies/03-ptj/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/05-dependencies/03-ptj/gradle.properties -------------------------------------------------------------------------------- /05-dependencies/03-ptj/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ptj' 2 | 3 | -------------------------------------------------------------------------------- /05-dependencies/03-ptj/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /05-dependencies/04-deptree/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### gradle依赖树-以树形结构查看相关依赖 3 | 4 | 主要依赖于如下两个命令 可以用示例的脚本试一下 5 | 由父寻子 6 | ``` 7 | gradle dependencies 8 | ``` 9 | 10 | 由子寻父,需要指定寻找哪个子的父亲 11 | ``` 12 | gradle dependencyInsight --dependency depName 13 | 14 | ``` 15 | 16 | 此示例内容参见userguide(ver.2.9)中的11.6.4-11.6.5章节 -------------------------------------------------------------------------------- /05-dependencies/04-deptree/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin : 'java' 2 | repositories { 3 | jcenter() 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | compile "org.springframework:spring-webmvc:+" 9 | } 10 | 11 | -------------------------------------------------------------------------------- /05-dependencies/05-gradleCacheHome/README.md: -------------------------------------------------------------------------------- 1 | ####4 Gradle指定/修改缓存目录 2 | 3 | 4 | 5 | 可以 6 | 法1.通过添加系统变量 GRADLE_USER_HOME 7 | 法2.设置虚拟机参数 org.gradle.user.home 属性 8 | 法3.通过命令行-g或者 --gradle-user-home 参数设置 9 | 10 | Note, «GRADLE_USER_HOME» defaults to «USER_HOME»/.gradle, where «USER_HOME» is the home directory of the current user. This location can be configured via the -g and --gradle-user-home command line switches, as well as by the GRADLE_USER_HOME environment variable and org.gradle.user.home JVM system property. 11 | 12 | 示例援引官方userguide第18.2章节(ver2.9) -------------------------------------------------------------------------------- /05-dependencies/05-gradleCacheHome/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin : 'java' 2 | repositories { 3 | jcenter() 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | compile "org.springframework:spring-webmvc:+" 9 | } 10 | 11 | -------------------------------------------------------------------------------- /05-dependencies/06-moduleVersion/README.md: -------------------------------------------------------------------------------- 1 |   可以通过局部变量或者定义扩展属性的方式对依赖的版本进行集中式管理,这样可以做到统一维护,统一升级。这里更推荐采用扩展属性的方式进行定义,定义在扩展属性中,即使子模块也可以一样进行引用。 -------------------------------------------------------------------------------- /05-dependencies/06-moduleVersion/build.gradle: -------------------------------------------------------------------------------- 1 | //应用插件 2 | apply plugin: 'java' 3 | //采用扩展属性管理版本号(推荐,子模块可用) 4 | ext { 5 | bootVersion = "1.3.5.RELEASE" 6 | } 7 | 8 | //定义仓库 9 | repositories { 10 | jcenter() 11 | } 12 | 13 | //定义依赖 14 | dependencies { 15 | //采用局部变量管理版本号 16 | // + 表示 始终检查该依赖的最新版本 17 | def apache="+" 18 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 19 | //jpa 20 | "org.springframework.boot:spring-boot-starter-data-jpa:${bootVersion}", 21 | "org.springframework.boot:spring-boot-starter-tomcat:${bootVersion}", 22 | "org.apache.commons:commons-lang3:${apache}" 23 | } 24 | 25 | -------------------------------------------------------------------------------- /05-dependencies/06-moduleVersion/src/main/java/TigerSayHi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Leon on 2015/12/14. 3 | */ 4 | public class TigerSayHi { 5 | public static void main(String[] args) { 6 | Tiger.sayHi(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /05-dependencies/07-transitive/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### Gradle依赖传递 3 | 4 | 有时候,你可能不需要依赖进行传递 那么你可以看build文件中是怎么做的 5 | 6 | #### 一般技能 7 | // 法 . 0 . 使用@jar 8 | 9 | // 法 . 1 . 不需要传递依赖 10 | 11 | // 法 . 2 . 不需要传递依赖 12 | 13 | // 法 . 3 . 排除某个间接依赖 14 | 15 | #### 大招 16 | //法 . 4 . 全局禁止依赖传递 17 | 18 | //法 . 5 . 全局禁止部分依赖传递 -------------------------------------------------------------------------------- /05-dependencies/07-transitive/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | 3 | // 法 . 0 . 使用@jar 4 | compile 'group:artifact:version@jar' 5 | 6 | // 法 . 1 . 不需要传递依赖 7 | compile('group:artifact:version') { 8 | transitive = false 9 | } 10 | // 法 . 2 . 不需要传递依赖 11 | compile group: 'g', name: 'a, version:'v', transitive: false 12 | 13 | // 法 . 3 . 排除某个间接依赖 14 | compile('group:artifact:version') { 15 | exclude 'org.slf4j:slf4j-api' 16 | } 17 | 18 | 19 | //下面是大招 20 | //法 . 4 . 全局禁止依赖传递 21 | //configurations { 22 | // all*.transitive = false 23 | //} 24 | 25 | //法 . 5 . 全局禁止部分依赖传递 26 | //configurations { 27 | // all*.exclude group: 'group' 28 | //} 29 | } -------------------------------------------------------------------------------- /05-dependencies/08-clientModule/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin : 'war' 2 | 3 | repositories { 4 | jcenter() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | compile module("com.alibaba:druid:1.0.26") { 10 | dependency("cn.pkaq:ptj.tiger:+") 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /05-dependencies/08-clientModule/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/05-dependencies/08-clientModule/src/main/resources/basefile -------------------------------------------------------------------------------- /05-dependencies/09-publish/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'maven-publish' 2 | apply plugin: 'java' 3 | 4 | // 打包源文件 5 | task sourceJar(type: Jar) { 6 | from sourceSets.main.allSource 7 | classifier = 'sources' 8 | } 9 | 10 | task javadocJar(type: Jar, dependsOn: javadoc) { 11 | classifier = 'javadoc' 12 | from javadoc.destinationDir 13 | } 14 | 15 | publishing { 16 | // 目标仓库 17 | repositories { 18 | maven { 19 | url "$buildDir/repo" 20 | } 21 | } 22 | 23 | publications { 24 | mavenJava(MavenPublication) { 25 | // 设置gav属性 26 | groupId 'org.pkaq' 27 | artifactId 'tiger' 28 | version '1.1' 29 | 30 | from components.java 31 | artifact sourceJar 32 | 33 | // 设置pom相关信息 34 | pom.withXml { 35 | Node root = asNode() 36 | root.appendNode('description', 'bazinga!') 37 | } 38 | } 39 | } 40 | 41 | } 42 | //生成一个元的pom文件 43 | model { 44 | tasks.generatePomFileForMavenJavaPublication { 45 | destination = file("$buildDir/generated-pom.xml") 46 | } 47 | } -------------------------------------------------------------------------------- /05-dependencies/09-publish/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /06-task/01-task/build.gradle: -------------------------------------------------------------------------------- 1 | task helloTask { 2 | println "Hello World" 3 | } -------------------------------------------------------------------------------- /06-task/02-action/build.gradle: -------------------------------------------------------------------------------- 1 | task helloTask { 2 | doLast { 3 | println "Hello World" 4 | } 5 | } -------------------------------------------------------------------------------- /06-task/03-depends/build.gradle: -------------------------------------------------------------------------------- 1 | task one{ 2 | group 'timo' 3 | doLast { 4 | println "Hello frist" 5 | } 6 | } 7 | task two(dependsOn: one){ 8 | doLast { 9 | println "Hello two" 10 | } 11 | } 12 | task three{ 13 | dependsOn two 14 | doLast { 15 | println "Hello three" 16 | } 17 | } 18 | task four{ 19 | mustRunAfter three 20 | doLast { 21 | println "Hello four" 22 | } 23 | 24 | } 25 | three.finalizedBy four 26 | -------------------------------------------------------------------------------- /06-task/04-skip/build.gradle: -------------------------------------------------------------------------------- 1 | task one{ 2 | enabled false 3 | doLast{ 4 | println "Hello frist" 5 | } 6 | } 7 | task two(dependsOn:one){ 8 | doLast{ 9 | println "Hello two" 10 | } 11 | 12 | inputs.upToDateWhen{true} 13 | outputs.upToDateWhen{true} 14 | 15 | } 16 | 17 | task three{ 18 | dependsOn two 19 | doLast { 20 | println "Hello three" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /06-task/05-dynamic/build.gradle: -------------------------------------------------------------------------------- 1 | 4.times { counter -> 2 | task "task$counter" { 3 | doLast{ 4 | println "I'm task number $counter" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /06-task/06-inbuild/build.gradle: -------------------------------------------------------------------------------- 1 | task copyTask(type: Copy) { 2 | from '.' 3 | into 'abc' 4 | include 'in.txt' 5 | } -------------------------------------------------------------------------------- /06-task/07-customTask/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | class Inner extends DefaultTask { 3 | String words = 'Inner' 4 | 5 | @TaskAction 6 | def action1() { println words + name } 7 | 8 | @TaskAction 9 | def action2() { println words + ' InnerTom' } 10 | } 11 | 12 | 13 | task say(type: Hello) { 14 | words = 'Aloha ' 15 | doFirst { println 'fisrt blood' } 16 | doLast { println 'double kill' } 17 | } 18 | 19 | task sayIn(type: Inner) { 20 | words = 'Aloha Inner ' 21 | doFirst { println 'Inner blood' } 22 | doLast { println 'Inner kill' } 23 | } -------------------------------------------------------------------------------- /06-task/07-customTask/buildSrc/src/main/groovy/org.pkaq/Hello.groovy: -------------------------------------------------------------------------------- 1 | import org.gradle.api.DefaultTask 2 | import org.gradle.api.tasks.TaskAction 3 | 4 | class Hello extends DefaultTask { 5 | String words = 'hello' 6 | 7 | @TaskAction 8 | def action1() { println words + name } 9 | 10 | @TaskAction 11 | def action2() { println words + ' Tom' } 12 | } -------------------------------------------------------------------------------- /07-plugin/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-gradle-plugin' 3 | id 'com.gradle.plugin-publish' version '0.10.0' 4 | } 5 | apply plugin: 'groovy' 6 | apply plugin: 'maven' 7 | 8 | group = 'org.pakq' 9 | archivesBaseName="plugin" 10 | version = '1.0' 11 | 12 | pluginBundle { 13 | website = 'https://github.com/GradleCN/GradleSide' 14 | vcsUrl = 'https://github.com/GradleCN/GradleSide' 15 | tags = ['买了佛冷', 'pluginlearn'] 16 | } 17 | gradlePlugin { 18 | plugins { 19 | foLeng { 20 | id = 'org.pkaq.foLeng' 21 | displayName = 'Mai le fo leng?' 22 | description = '' 23 | implementationClass = 'org.pkaq.FoLengPlugin' 24 | } 25 | } 26 | } 27 | 28 | repositories { 29 | mavenCentral() 30 | } 31 | dependencies { 32 | compile localGroovy() 33 | compile gradleApi() 34 | } 35 | // 发布插件到本地目录 36 | uploadArchives { 37 | repositories { 38 | mavenDeployer { 39 | repository(url: uri('/opt/repo')) 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /07-plugin/gradle.properties: -------------------------------------------------------------------------------- 1 | gradle.publish.key=mykey 2 | gradle.publish.secret=mysecret -------------------------------------------------------------------------------- /07-plugin/src/main/groovy/org.pkaq/FoLengPlugin.groovy: -------------------------------------------------------------------------------- 1 | package org.pkaq 2 | import org.gradle.api.Plugin 3 | import org.gradle.api.Project 4 | 5 | class FoLengPlugin implements Plugin{ 6 | @Override 7 | void apply(Project project) { 8 | /**注册一个扩展容器,扩展容器可以使我们在一个闭包中为task赋值*/ 9 | project.extensions.create('foleng', FolengExtension) 10 | folengTask(project) 11 | } 12 | 13 | private void folengTask(Project project){ 14 | project.tasks.withType(FoLengTask) { 15 | /**查找扩展容器中已配置的属性*/ 16 | def extension = project.extensions.findByName('foleng') 17 | /**将闭包中的扩展属性值赋给 FoLengTask 的相关属性*/ 18 | conventionMapping.words = { extension.words } 19 | } 20 | project.task('mlfl', type: FoLengTask) { 21 | conventionMapping.words = { 22 | project.hasProperty('words') ? 23 | project.words : 24 | project.extensions.findByName('foleng').words 25 | } 26 | doLast { 27 | println ' The End ' 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /07-plugin/src/main/groovy/org.pkaq/FoLengTask.groovy: -------------------------------------------------------------------------------- 1 | package org.pkaq 2 | 3 | import org.gradle.api.DefaultTask 4 | import org.gradle.api.tasks.Input 5 | import org.gradle.api.tasks.TaskAction 6 | 7 | class FoLengTask extends DefaultTask { 8 | @Input 9 | String words = 'Hello' 10 | 11 | FoLengTask(){ 12 | description = "Mai Le FoLeng?" 13 | group = "FoLeng" 14 | } 15 | 16 | @TaskAction 17 | void mlfl() { 18 | // 获取输入的属性 19 | words = getWords() 20 | println ''' 21 | _ooOoo_ 22 | o8888888o 23 | 88" . "88 24 | (| -_- |) 25 | O\\ = /O 26 | ____/`---'\\____ 27 | .' \\\\| |// `. 28 | / \\\\||| : |||// \\ 29 | / _||||| -:- |||||- \\ 30 | | | \\\\\\ - /// | | 31 | | \\_| ''\\---/'' | | 32 | \\ .-\\__ `-` ___/-. / 33 | ___`. .' /--.--\\ `. . __ 34 | ."" '< `.___\\_<|>_/___.' >'"". 35 | | | : ` - `.;`\\ _ /`;.`/ - ` : | | 36 | \\ \\ `-. \\_ __\\ /__ _/ .-` / / 37 | ======`-.____`-.___\\_____/___.-`____.-'====== 38 | `=---=' 39 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 40 | 佛祖保佑 永无BUG 41 | 42 | ''' 43 | println " < - ${words} ->" 44 | } 45 | } -------------------------------------------------------------------------------- /07-plugin/src/main/groovy/org.pkaq/FolengExtension.groovy: -------------------------------------------------------------------------------- 1 | package org.pkaq 2 | 3 | // 扩展属性 4 | class FolengExtension { 5 | String words 6 | } -------------------------------------------------------------------------------- /07-plugin/src/main/resources/META-INF/gradle-plugins/org.pkaq.foLeng.properties: -------------------------------------------------------------------------------- 1 | implementation-class=org.pkaq.FoLengPlugin -------------------------------------------------------------------------------- /07-properties/README.md: -------------------------------------------------------------------------------- 1 | 这是一个使用gradle操作Properties文件的示例 2 | 本示例代码已在gradle 2.8 2.9版本运行通过 3 | 4 | 主要包括了properties文件的 读取、修改等操作 5 | 6 | 1.gradle rP 读取配置文件属性 7 | 2.gradle uP 更改配置文件内容 8 | 3.gradle bP -Pkeyp=imkp 读取 -P 参数传入的属性 9 | 4.gradle bD -Dkeyd=imkd 读取 -D参数传入的属性 10 | 11 | 更多用法详询PropertiesAPI 12 | 13 | -D属性会被传送给启动Gradle的jvm,作为一个系统属性被jvm使用。 14 | -P属性则会被直接加载到Gradle领域对象上 15 | 16 | ####Gradle支持三种Properties 17 | ####System Properties: 18 | 1.可通过gradle.properties文件,环境变量或命令行-D参数设置 19 | 2.可在setting.gradle或build.gradle中动态修改,在setting.gradle中的修改对buildscript block可见; 20 | 3.所有工程可见,不建议在build.gradle中修改 21 | 4.多子工程项目中,子工程的gradle.properties会被忽略掉,只有root工程的gradle.properties有效 22 | 23 | 24 | ####Project Properties: 25 | 1.可通过gradle.properties文件,环境变量或命令行-P参数设置,优先级是: 26 | 2.可在build.gradle中动态修改,但引用不存在的project properties会立即抛错 27 | 3.动态修改过的project properties在buildscript block中不可见 28 | 29 | 30 | ####Project ext properties: 31 | 1.可在项目的build.gradle中声明和使用,本工程和子工程可见 32 | 2.不能在setting.gradle中访问 33 | 34 | 35 | 如果有多处设置,加载次序如下,后面的覆盖前面的设置 36 | 1.from gradle.properties located in project build dir. 37 | 2.from gradle.properties located in gradle user home. 38 | 3.from system properties, e.g. when -Dsome.property is used in the command line. 39 | 4.setting.gradle 40 | 5.build.gradle 41 | 42 | -------------------------------------------------------------------------------- /07-properties/build.gradle: -------------------------------------------------------------------------------- 1 | def filePath = "${project.projectDir}/src/main/resources/jdbc.txt" 2 | def file = file(filePath) 3 | def props = new Properties() 4 | 5 | ext{ 6 | ext_tiger = "peny" 7 | } 8 | 9 | 10 | //读取文件 11 | task loadPorperties{ 12 | file.withInputStream { stream-> 13 | props.load(stream) 14 | } 15 | } 16 | 17 | task retrieveProperties <<{ 18 | //读取gradle.properties文件中的属性 19 | println GRADLE_TIGER 20 | //读取ext自定义property 21 | println ext_tiger; 22 | //读取指定位置文件中的property 23 | println "retrieveProperties : "+props.getProperty('jdbc.user'); 24 | } 25 | 26 | 27 | task updateProperties <<{ 28 | 29 | props.setProperty("jdbc.user","frank") 30 | 31 | println "after update : "+props.getProperty('jdbc.user'); 32 | //回写文件 33 | new File(filePath).withOutputStream { 34 | stream -> props.store(stream,"ConfigFile Update:"+new Date()) 35 | } 36 | 37 | } 38 | //读取-P属性 39 | task BigPprop <<{ 40 | println "${keyp}" 41 | 42 | } 43 | //读取-D属性 44 | task BigDprop <<{ 45 | println System.properties['keyd'] 46 | } -------------------------------------------------------------------------------- /07-properties/gradle.properties: -------------------------------------------------------------------------------- 1 | GRADLE_TIGER=PI 2 | 3 | 4 | -------------------------------------------------------------------------------- /07-properties/src/main/resources/jdbc.txt: -------------------------------------------------------------------------------- 1 | #ConfigFile Update:Wed Dec 30 09:24:45 CST 2015 2 | #Wed Dec 30 09:24:45 CST 2015 3 | jdbc.user=frank 4 | -------------------------------------------------------------------------------- /08-sourceset/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### 自定义项目目录结构 3 | 4 | 在为一些老项目打包时,作为一线程序员往往因不可抗力因素, 5 | 是无法凭借一己之力将资源文件随便就随便修改项目结构的。 6 | 7 | 此时你就需要自定义项目结构了 8 | -------------------------------------------------------------------------------- /08-sourceset/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | sourceSets { 4 | main { 5 | java { 6 | srcDirs = ['src/xxx/java'] 7 | } 8 | //没错 我同时把resource指向了java目录 这样就可以收录java目录中的资源文件了 9 | //注意:gradle会以你指定的目录为根 去寻找当前目录以及子目录下的资源文件 10 | //如果你想带路径复制 最好不要指定到具体的子包(如:src/main/java/mybatis/mapper/module) 不然资源会位于根目录下 11 | resources { 12 | srcDirs = ['src/xxx/resources','src/xxx/java'] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /08-sourceset/src/xxx/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /08-sourceset/src/xxx/java/config/mybatis/mybatis.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/08-sourceset/src/xxx/java/config/mybatis/mybatis.xml -------------------------------------------------------------------------------- /08-sourceset/src/xxx/java/lm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/08-sourceset/src/xxx/java/lm.jpg -------------------------------------------------------------------------------- /08-sourceset/src/xxx/java/prop/config.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/08-sourceset/src/xxx/java/prop/config.properties -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/README.md: -------------------------------------------------------------------------------- 1 | # GradleSide 2 | Gradle 示例大全 3 | 4 | 1.multi-project : gradle多项目示例 5 | 6 | 其中项目(Project)或者称之为模块(Module)之间的依赖关系如下图,估计也该够用了,其实勤奋的小伙伴可以好好看下 7 | userguide的第59章,电梯在此 : [点我点我点我,我是传送门](https://docs.gradle.org/current/userguide/multi_project_builds.html) 8 | ![image](pic.jpg) -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/base/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/base/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/01-multi-project/base/src/main/resources/basefile -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/build.gradle: -------------------------------------------------------------------------------- 1 | subprojects { 2 | apply plugin: 'java' 3 | group = 'org.gradle.sample.dag' 4 | version = '1.0' 5 | } -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/01-multi-project/pic.jpg -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'multi-project' 2 | include 'base' 3 | include 'webcore' 4 | include 'webapp' 5 | include 'webmanagement' 6 | include 'weball:weball' 7 | findProject(':weball:weball')?.name = 'weball/weball' 8 | 9 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/weball/weball/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'war' 2 | 3 | dependencies { 4 | compile project(':base'), 5 | project(':webcore'), 6 | project(':webmanagement') 7 | } 8 | 9 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/weball/weball/build/tmp/war/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webapp/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'war' 2 | 3 | dependencies { 4 | compile project(':base'), 5 | project(':webcore') 6 | } 7 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webapp/build/tmp/war/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webapp/src/main/resources/webapp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/01-multi-project/webapp/src/main/resources/webapp -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webcore/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | dependencies { 4 | compile project(':base') 5 | } 6 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webcore/src/main/resources/webcore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/01-multi-project/webcore/src/main/resources/webcore -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webmanagement/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'war' 2 | 3 | dependencies { 4 | compile project(':base'), 5 | project(':webapp') 6 | } 7 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webmanagement/build/tmp/war/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /09-multi-project/01-multi-project/webmanagement/src/main/resources/webmanagement: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/01-multi-project/webmanagement/src/main/resources/webmanagement -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/README.md: -------------------------------------------------------------------------------- 1 | #### 多模块项目之 - spring boot + gradle + 构建公共jsp页面的多模块项目 2 | 3 | 标题党!!!! 4 | 5 | #### 烹制原理 6 | Servlet 3.1 规范里 jar包中`META-INF/resources/`下的文件会被视为根目录文件进行正常访问 , 这也就意味着我们可以将某些 静态页面/图片/样式/js 等打到jar包里当做依赖jar包引用 , 像`webjars`基本就是这么搞的.当然 如果你在搞前后端分离、gulp、webpack什么的这种方式基本也不用考虑了。 7 | 8 | Servlet 3.1 中文译本 张开涛 翻译版下载 [> 点传送门 <](http://jinnianshilongnian.iteye.com/blog/1912455) 9 | 10 | - 引用.1 11 | >除了 静态资源和 WEB-INF/lib 目录下打包在 JAR 文件中 META-INF/resources 目录下的 JSP 文件之外,WEB-INF 目录下包含的其他任何文件都不能由容器直接提供给客户端访问。 12 | > serverlet 3.1 规范 - 10.5 13 | 14 | - 引用.2 15 | >4. 添加了从 JAR 文件中加载静态资源和 JSP 的支持,其包含在绑定在 WEB-INF/lib 目录中的 JAR 文件的 META-INF/resources 目录中 16 | >变更历史 A.3 17 | 18 | 19 | #### 烹制方法 20 | 21 | 1. 添加spring boot 依赖,如果不想用变量定义版本号可以直接撸版本号 22 | ```groovy 23 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 24 | "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}" 25 | ``` 26 | 27 | 2. 编写controller 28 | ```java 29 | @Controller 30 | @Slf4j 31 | public class TigerCtrl { 32 | @RequestMapping("/") 33 | public ModelAndView tiger(){ 34 | log.info("Soft kitty,warm kitty Little ball of fur ."); 35 | return new ModelAndView("tiger","words","Roar ~ Roar ~ "); 36 | } 37 | } 38 | ``` 39 | 40 | 3. 编写页面 41 | ```xml 42 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 43 | 44 | 45 | Title 46 | 47 | 48 | j2ee
49 |
50 | <% 51 | String words = String.valueOf(request.getAttribute("words")); 52 | out.println("Tiger said : " + words); 53 | %> 54 | 55 | 56 | ``` 57 | 58 | 4. 添加公共jsp页面模块依赖 59 | ```groovy 60 | compile project(":webpage") 61 | ``` 62 | 63 | #### 完整代码 64 | 65 | [ > 点击这里看完整代码 < ](https://github.com/pkaq/GradleSide/tree/master/15-multi-project-springboot) 66 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | bootVersion = "1.5.6.RELEASE" 3 | tomcat_embed = "8.5.4" 4 | } 5 | 6 | //用allprojects方法给所有的项目添加group和version属性 7 | allprojects { 8 | group = 'org.pkaq' 9 | version = '1.0' 10 | } 11 | 12 | subprojects { 13 | apply plugin: 'java' 14 | 15 | repositories { 16 | maven { url"https://repo.spring.io/libs-release" } 17 | jcenter() 18 | mavenCentral() 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/settings.gradle: -------------------------------------------------------------------------------- 1 | include "webpage" 2 | include "webserver" 3 | 4 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webpage/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webpage/src/main/resources/META-INF/resources/static/duke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/02-multi-project-springboot/webpage/src/main/resources/META-INF/resources/static/duke.jpg -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webpage/src/main/resources/META-INF/resources/web/tiger.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | Title 5 | 6 | 7 | j2ee
8 |
9 | <% 10 | String words = String.valueOf(request.getAttribute("words")); 11 | out.println("Tiger said : " + words); 12 | %> 13 | 14 | 15 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webserver/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 3 | "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}" 4 | compileOnly "org.projectlombok:lombok:1.16.10" 5 | 6 | compile project(":webpage") 7 | } 8 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webserver/src/main/java/org/pkaq/Booter.java: -------------------------------------------------------------------------------- 1 | package org.pkaq; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.boot.CommandLineRunner; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | 9 | /** 10 | * @Description: 应用配置启动入口. 11 | * @FileName: Booter.java 12 | * @Author: S.PKAQ 13 | * @Version: 1.0 14 | * @Date: 2016年4月7日 上午9:28:07 15 | */ 16 | @SpringBootApplication 17 | @Slf4j 18 | public class Booter implements CommandLineRunner { 19 | /** 20 | * 入口函数. 21 | * @param args args 22 | */ 23 | @Autowired 24 | public static void main(String[] args) { 25 | SpringApplication.run(Booter.class, args); 26 | } 27 | 28 | public void run(String... args) throws Exception { 29 | log.info(" --- --- --- [ web started ] --- --- --- "); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webserver/src/main/java/org/pkaq/web/controller/TigerCtrl.java: -------------------------------------------------------------------------------- 1 | package org.pkaq.web.controller; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.servlet.ModelAndView; 7 | 8 | /** 9 | * Created with IntelliJ IDEA. 10 | * Author: S.PKAQ 11 | * Datetime: 2016-12-01 16:33 12 | */ 13 | @Controller 14 | @Slf4j 15 | public class TigerCtrl { 16 | @RequestMapping("/") 17 | public ModelAndView tiger(){ 18 | log.info("Soft kitty,warm kitty Little ball of fur ."); 19 | return new ModelAndView("tiger","words","Roar ~ Roar ~ "); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /09-multi-project/02-multi-project-springboot/webserver/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | mvc: 3 | date-format: yyyy-MM-dd 4 | view: 5 | prefix: /web/ 6 | suffix: .jsp 7 | server: 8 | context-path: / 9 | port: 80 -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/README.md: -------------------------------------------------------------------------------- 1 | # GradleSide 2 | Gradle 示例大全 3 | 4 | 16.flat-multi-project : gradle多项目示例 5 | 6 | 一个简单的水平布局的多项目示例 7 | main依赖base 8 | 9 | 心法在于两点 10 | 11 | 1. 根项目与被依赖的项目(在水平意义上的子项目,视觉上根项目的兄弟项目)保持平级。 12 | 2. 配置根项目的 `setting.gradle` , 采用 `includeFlat` 来描述子项目路径(由于采用的是水平布局,默认根路径就是当前根项目的上级路径,所以无需用../上跳) 13 | 3. 观摩示例 -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/base/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | dependencies { 4 | compile "com.google.guava:guava:+" 5 | } 6 | 7 | -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/base/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/03-multi-project-flat/base/src/main/resources/basefile -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/main/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'war' 2 | 3 | dependencies { 4 | compile project(':base') 5 | } 6 | 7 | allprojects { 8 | group = 'org.pkaq.gradle.multi.flat' 9 | version = '1.0' 10 | 11 | repositories { 12 | maven { url"https://repo.spring.io/libs-release" } 13 | jcenter() 14 | mavenCentral() 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/main/settings.gradle: -------------------------------------------------------------------------------- 1 | includeFlat 'base' 2 | 3 | -------------------------------------------------------------------------------- /09-multi-project/03-multi-project-flat/main/src/main/resources/webapp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/03-multi-project-flat/main/src/main/resources/webapp -------------------------------------------------------------------------------- /09-multi-project/04-multi-project-central/README.md: -------------------------------------------------------------------------------- 1 | # GradleSide 2 | Gradle 示例大全 3 | 4 | 17-multi-project-central : gradle多项目示例 5 | 6 | 一个简单的采用集中化配置多项目示例 `main依赖base` 7 | -------------------------------------------------------------------------------- /09-multi-project/04-multi-project-central/base/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/04-multi-project-central/base/src/main/resources/basefile -------------------------------------------------------------------------------- /09-multi-project/04-multi-project-central/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | group = 'org.pkaq.gradle.multi' 3 | version = "0.1.0" 4 | } 5 | 6 | subprojects { 7 | apply plugin: 'java' 8 | } 9 | 10 | 11 | project(':main'){ 12 | 13 | apply plugin: 'war' 14 | 15 | dependencies { 16 | compile project(':base') 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /09-multi-project/04-multi-project-central/main/src/main/resources/webapp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/04-multi-project-central/main/src/main/resources/webapp -------------------------------------------------------------------------------- /09-multi-project/04-multi-project-central/settings.gradle: -------------------------------------------------------------------------------- 1 | include 'base','main' 2 | 3 | println "< ---- build init ---- > " 4 | 5 | def initFunc(){ 6 | println "" 7 | } 8 | 9 | initFunc() -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/README.md: -------------------------------------------------------------------------------- 1 | #### 多模块项目之 - spring boot + gradle + 集中管理依赖 2 | 3 | 借助`Gradle`脚本的`ext`扩展属性, 可以将所有模块的依赖进行集中管理, 原理就是通过在`ext`块中定义版本号并且维护一个对应的`map`,在子模块应用的时候可以直接通过引用该`map`的key值来获取依赖 4 | 5 | ```groovy 6 | ext { 7 | springBootVersion = '2.3.1.RELEASE' 8 | lombok = "1.18.12" 9 | 10 | lib = ["spring" : "org.springframework.boot:spring-boot-starter-web:${springBootVersion}", 11 | // lombok 12 | "lombok" : "org.projectlombok:lombok:${lombok}" 13 | ] 14 | } 15 | ``` 16 | 17 | 子模块中可以直接通过key值来引用相应的依赖 18 | ```groovy 19 | dependencies { 20 | compile "${lib.spring}" 21 | 22 | compile project(":webpage") 23 | } 24 | ``` -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | springBootVersion = '2.3.1.RELEASE' 3 | lombok = "1.18.12" 4 | 5 | lib = ["spring" : "org.springframework.boot:spring-boot-starter-web:${springBootVersion}", 6 | // lombok 7 | "lombok" : "org.projectlombok:lombok:${lombok}" 8 | ] 9 | } 10 | 11 | 12 | // 用allprojects方法给所有的项目添加group和version属性 13 | allprojects { 14 | group = 'org.pkaq' 15 | version = '1.0' 16 | } 17 | 18 | subprojects { 19 | apply plugin: 'java' 20 | 21 | repositories { 22 | maven { url"https://repo.spring.io/libs-release" } 23 | jcenter() 24 | mavenCentral() 25 | } 26 | dependencies { 27 | implementation "${lib.lombok}" 28 | annotationProcessor "${lib.lombok}" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/settings.gradle: -------------------------------------------------------------------------------- 1 | include "webpage" 2 | include "webserver" 3 | 4 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webpage/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webpage/src/main/resources/META-INF/resources/static/duke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/09-multi-project/05-multi-project-centraldep/webpage/src/main/resources/META-INF/resources/static/duke.jpg -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webpage/src/main/resources/META-INF/resources/web/tiger.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | Title 5 | 6 | 7 | j2ee
8 |
9 | <% 10 | String words = String.valueOf(request.getAttribute("words")); 11 | out.println("Tiger said : " + words); 12 | %> 13 | 14 | 15 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webserver/build.gradle: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compile "${lib.spring}" 3 | 4 | compile project(":webpage") 5 | } 6 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webserver/src/main/java/org/pkaq/Booter.java: -------------------------------------------------------------------------------- 1 | package org.pkaq; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.boot.CommandLineRunner; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | 9 | /** 10 | * @Description: 应用配置启动入口. 11 | * @FileName: Booter.java 12 | * @Author: S.PKAQ 13 | * @Version: 1.0 14 | * @Date: 2016年4月7日 上午9:28:07 15 | */ 16 | @SpringBootApplication 17 | @Slf4j 18 | public class Booter implements CommandLineRunner { 19 | /** 20 | * 入口函数. 21 | * @param args args 22 | */ 23 | @Autowired 24 | public static void main(String[] args) { 25 | SpringApplication.run(Booter.class, args); 26 | } 27 | 28 | public void run(String... args) throws Exception { 29 | log.info(" --- --- --- [ web started ] --- --- --- "); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webserver/src/main/java/org/pkaq/web/controller/TigerCtrl.java: -------------------------------------------------------------------------------- 1 | package org.pkaq.web.controller; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.servlet.ModelAndView; 7 | 8 | /** 9 | * Created with IntelliJ IDEA. 10 | * Author: S.PKAQ 11 | * Datetime: 2016-12-01 16:33 12 | */ 13 | @Controller 14 | @Slf4j 15 | public class TigerCtrl { 16 | @RequestMapping("/") 17 | public ModelAndView tiger(){ 18 | log.info("Soft kitty,warm kitty Little ball of fur ."); 19 | return new ModelAndView("tiger","words","Roar ~ Roar ~ "); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /09-multi-project/05-multi-project-centraldep/webserver/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | mvc: 3 | date-format: yyyy-MM-dd 4 | view: 5 | prefix: /web/ 6 | suffix: .jsp 7 | server: 8 | context-path: / 9 | port: 80 -------------------------------------------------------------------------------- /10-unicode/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### 乱码问题解决 3 | 4 | 重要提示:如果你遇到的是代码第一行提示非法字符 65279 那么 5 | 这是因为你的文件头有BOM码,至于什么是BOM码自行百度 6 | 请用notepad++一类工具去除即可 7 | 8 | 关于gradle编译乱码主要是由于 编译使用的字符集编码与代码文件使用的字符集编码不一致 9 | 10 | 安装系统之后,一般中文系统默认字符集是GBK。我们安装的软件一般都继承使用操作系统的默认字符集。 11 | 12 | 你可以在你控制台邮件属性查看一下可以看到 13 | 14 | 具体解决方式有四种 可以任选一种 15 | 法1-3在build.gradle中 法4在gradle.properties中 -------------------------------------------------------------------------------- /10-unicode/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | apply plugin :'java' 3 | //解决警告:编码 GBK 的不可映射字符 4 | //指定UTF-8编码 5 | //法 . 1 . 6 | tasks.withType(JavaCompile) { 7 | // options.encoding = "UTF-8" 8 | } 9 | 10 | //下面这种写法也可以,与上面任选其一即可 11 | //法 . 2 . 12 | //[ compileJava, compileTestJava ]*.options*.encoding = 'UTF-8' 13 | 14 | //下面这种写法也可以,与上面任选其一即可 15 | //法 . 3 . 此种写法是官方推荐的,至少当时那个版本的userguide里是 16 | //此法不仅可以解决中文注释引起的编译不通过乱码,而且对于项目中存在中文文件导致的乱码也可以解决 17 | //调用命令的时候添加-D参数 ,-Dfile.encoding=UTF-8 18 | 19 | -------------------------------------------------------------------------------- /10-unicode/gradle.properties: -------------------------------------------------------------------------------- 1 | //法 . 4 . 2 | systemProp.file.encoding=UTF-8 -------------------------------------------------------------------------------- /10-unicode/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | //老虎 5 | public class Tiger { 6 | public static void sayHi(){ 7 | System.out.println("Hi~老虎"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /10-unicode/src/main/resources/心有猛虎,细嗅蔷薇.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/10-unicode/src/main/resources/心有猛虎,细嗅蔷薇.txt -------------------------------------------------------------------------------- /11-resources/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### 打包src/main/java中的资源文件 3 | 4 | 可能有的同学会有疑问,为什么会有此篇。 5 | 实际上这个需求在老项目和采用mybatis的项目上体现的比较突出。 6 | 但作为一线程序员往往因不可抗力因素是无法凭借一己之力将资源文件随便就挪动位置的。 7 | so... 8 | 9 | 解决此问题思路有几种 10 | 1.移动资源文件到resources下 11 | 2.将资源文件包含进来 12 | 3.将resources指向目标目录 13 | 14 | 15 | 本文档采用的是第二种,至于第三种有兴趣的同学可以更改sourceset进行操作 16 | 特别说明: 17 | 由于gradle在build时会把类文件和资源文件分别放到 build/classes,build/resources下 18 | 所以classes下仍然是无法看到资源文件的,但不影响打包 19 | 如示例所示,修改了jar任务的一些行为,所以会在打jar的时候生效 20 | 如果是要打war包,稍微拓展一下 你就知道啦 21 | 22 | p.s 关于此篇文件夹名称头两个单词 让我想起了 LOST -------------------------------------------------------------------------------- /11-resources/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | 4 | war { 5 | //指定包名,没错 这样也行 多查API 6 | baseName = 'supprise' 7 | 8 | //指定包含的文件 9 | //include xxx.x 10 | 11 | from('src/main/java') { 12 | include 'config/**/*.xml' 13 | } 14 | 15 | from('src/main/java') { 16 | include 'prop/**/*.properties' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /11-resources/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /11-resources/src/main/java/config/mybatis/mybatis.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/11-resources/src/main/java/config/mybatis/mybatis.xml -------------------------------------------------------------------------------- /11-resources/src/main/java/lm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/11-resources/src/main/java/lm.jpg -------------------------------------------------------------------------------- /11-resources/src/main/java/prop/config.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/11-resources/src/main/java/prop/config.properties -------------------------------------------------------------------------------- /12-specifyName/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ###打指定名称和版本号的jar包 3 | -------------------------------------------------------------------------------- /12-specifyName/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | //包名 3 | archivesBaseName="kitty" 4 | //版本号 5 | version = '1.0.0' -------------------------------------------------------------------------------- /12-specifyName/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /13-env/01-folder/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | 4 | sourceSets { 5 | main { 6 | resources { 7 | srcDir "src/main/resources/${env}" 8 | 9 | sourceSets.main.resources.srcDirs.each { 10 | it.listFiles().each { 11 | if(it.isDirectory()) { 12 | exclude "${it.name}" 13 | } 14 | } 15 | } 16 | } 17 | } 18 | } 19 | 20 | 21 | //sourceSets { 22 | // main { 23 | // resources { 24 | // srcDir "src/main/resources/${env}" 25 | // 26 | // sourceSets.main.resources.srcDirs.each { 27 | // it.listFiles().each { 28 | // if(it.isDirectory()) { 29 | // exclude "${it.name}" 30 | // } 31 | // } 32 | // } 33 | // } 34 | // } 35 | //} 36 | -------------------------------------------------------------------------------- /13-env/01-folder/gradle.properties: -------------------------------------------------------------------------------- 1 | env=dev -------------------------------------------------------------------------------- /13-env/01-folder/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /13-env/01-folder/src/main/resources/dev/dev.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/13-env/01-folder/src/main/resources/dev/dev.properties -------------------------------------------------------------------------------- /13-env/01-folder/src/main/resources/pro/pro.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/13-env/01-folder/src/main/resources/pro/pro.properties -------------------------------------------------------------------------------- /13-env/02-configfile/README.MD: -------------------------------------------------------------------------------- 1 | # 通过配置文件支持多环境构建 2 | 3 |   除了通过传入参数加载不同目录下的properties文件来实现多环境打包之外,还有一种更便捷的方式来实现这种操作. 4 | 借助Groovy的[ConfigSlurper](http://docs.groovy-lang.org/latest/html/gapi/groovy/util/ConfigSlurper.html#method_detail)特性可以简洁而明快的达到多环境打包的目的.打包时候仅需通过`-D`参数传入目标环境变量即可如:`gradle build -Denv=dev`,这里可以通过添加`gradle.properties`文件设置默认的环境变量值. 5 | 6 | 比如当前有如下需求: 7 | 8 | - 需要根据传入的变量参数进行不同环境打包 9 | - 需要根据不同环境参数改变esources目录下属性文件\xml文件等文件的内容 10 | 11 | 12 | 1.与`build.gradle`平级建立`config.groovy`,这里的命名可以随意. 13 | 14 | ```groovy 15 | environments { 16 | // 开发环境 17 | dev { 18 | db { 19 | username = "dev" 20 | password = 'devpwd' 21 | } 22 | } 23 | // 线上环境 24 | production { 25 | db { 26 | username = "prod" 27 | password = 'prodpwd' 28 | } 29 | } 30 | } 31 | ``` 32 | 2.修改`build.gradle` 33 | 34 | 引入ReplaceToken 35 | ```groovy 36 | import org.apache.tools.ant.filters.ReplaceTokens 37 | ``` 38 | 处理资源文件时进行加载替换 39 | ```groovy 40 | processResources { 41 | println "==> Load configuration for $env" 42 | def config = new ConfigSlurper(env).parse(file("config.groovy").toURI().toURL()).toProperties() 43 | 44 | from(sourceSets.main.resources.srcDirs) { 45 | filesMatching('**/*.properties') { 46 | filter(ReplaceTokens, tokens: config, beginToken : '${', endToken : '}') 47 | } 48 | } 49 | 50 | } 51 | 52 | ``` 53 |   默认情况下`ReplaceTokens`会将`@attribute@`的值替换成目标值,这里我们修改占位描述符为`${attribute}` 54 | 55 |   经过上面的操作,在执行打包命令时,`Gradle`会加载`config.groovy`文件中的配置对`src/main/resources`资源目录下的资源文件进行替换,注意这里替换的是所有资源文件(properties/xml/txt等)中的占位符,如果只想替换`properties`文件可以添加过滤限制来实现对部分文件内容的替换 56 | 57 | 法1. 58 | ```groovy 59 | from(sourceSets.main.resources.srcDirs) { 60 | filesMatching('**/*.properties') { 61 | filter(ReplaceTokens, tokens: config, beginToken : '${', endToken : '}') 62 | } 63 | } 64 | ``` 65 | 法2. 66 | ```groovy 67 | from(sourceSets.main.resources.srcDirs) { 68 | include '**/*.properties' 69 | filter(ReplaceTokens, tokens: config, beginToken : '${', endToken : '}') 70 | } 71 | ```` 72 | 73 | 完整代码在此: 74 | https://github.com/GradleCN/GradleSide/tree/master/12-env/02-configfile 75 | 76 | -------------------------------------------------------------------------------- /13-env/02-configfile/build.gradle: -------------------------------------------------------------------------------- 1 | import org.apache.tools.ant.filters.ReplaceTokens 2 | 3 | apply plugin: 'java' 4 | 5 | 6 | processResources { 7 | println "==> Load configuration for $env" 8 | def config = new ConfigSlurper(env).parse(file("config.groovy").toURI().toURL()).toProperties() 9 | 10 | from(sourceSets.main.resources.srcDirs) { 11 | filter(ReplaceTokens, tokens: config, beginToken : '${', endToken : '}') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /13-env/02-configfile/config.groovy: -------------------------------------------------------------------------------- 1 | environments { 2 | // 开发环境 3 | dev { 4 | db { 5 | username = "dev" 6 | password = 'devpwd' 7 | } 8 | } 9 | // 线上环境 10 | production { 11 | db { 12 | username = "prod" 13 | password = 'prodpwd' 14 | } 15 | } 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /13-env/02-configfile/gradle.properties: -------------------------------------------------------------------------------- 1 | env=dev -------------------------------------------------------------------------------- /13-env/02-configfile/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /13-env/02-configfile/src/main/resources/application.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ${db.username} 4 | ${db.password} 5 | 6 | -------------------------------------------------------------------------------- /13-env/02-configfile/src/main/resources/prop/init.properties: -------------------------------------------------------------------------------- 1 | user=${db.username} 2 | password=${db.password} 3 | jdbc=${user}/${password} -------------------------------------------------------------------------------- /13-env/README.MD: -------------------------------------------------------------------------------- 1 | 2 | ### 打不同环境的包 3 | 4 | 具体原理就是根据传入的参数修改`sourceset`的设定 5 | 6 | **01-folder** 7 | >把不同环境文件按folder归类存放,打包时将src/main/resources下的文件打包,标明环境的folder目录不变,排除掉其他环境的folder,如果需要去除环境目录直接将内容打到src/main/resources下可以将目标环境目录添加到srcDirs中 8 | 9 | 10 | 执行下面的命令打相关环境的包 11 | ```bash 12 | gradle -q -Penv=pro 13 | ``` 14 | 15 | 可以修改`gradle.properties`中的`env`默认值 16 | 17 | **02-Config File** 18 | > 通过`Config`文件,动态替换资源目录(src/main/resources)下的占位变量 19 | 20 | https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/Copy.html 21 | https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Copy.html 22 | https://docs.gradle.org/current/javadoc/org/gradle/language/jvm/tasks/ProcessResources.html -------------------------------------------------------------------------------- /14-lifecycle/README.md: -------------------------------------------------------------------------------- 1 | # GradleSide 2 | Gradle 示例大全 3 | 4 | #### 构建的生命周期 5 | 6 | ![Gradle构建的生命周期(图片源于网络)](.\img\lifecyle.png) 7 | 8 | 如上图,Gradle构建过程中需要经历三个阶段: 初始化阶段 、 配直阶段 、 执行阶段 9 | 10 | - 初始化阶段: 确定要参与构建的项目,创建配置Settings实例。 11 | > 在构建的 初始化阶段,Gradle 会读取settings.gradle这个文件,并创建一个 Settings 类型的实例。Gradle 会依据此文件进行多模块项目构建,默认情况下 Gradle 会从同级的 master 目录下寻找此文件,如果未找到则会去父级目录寻找。如果搜寻不到 settings 文件,那么 Gradle 会把模块当做单独构建的项目去执行单独构建。 12 | 13 | - 配置阶段: 确定task之间的依赖关系,并形成一张依赖关系图(有向无环图)决定task的执行顺序,这里需要注意的是 配置任务块时如果你的代码没有写到doFirst或者doLast里,那么代码会在配置阶段执行 14 | 15 | - 执行阶段: 执行具体的task,gradle会依据配置阶段形成的关系图将任务链上的任务按依赖顺序依次执行 16 | 17 | 这里有个示例 展示个各个阶段以及各个阶段一些钩子函数的应用 18 | 19 | - [生命周期示例](https://github.com/GradleCN/GradleSide/tree/master/13-lifecycle) 20 | > [更多钩子函数请参考 - Gradle obj](https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html) 21 | > [更多钩子函数请参考 - Project obj](https://docs.gradle.org/current/dsl/org.gradle.api.Project.html) 22 | 23 | 24 | 25 | 26 | 27 | _[参考资料 - Chapter 22. The Build Lifecycle] https://docs.gradle.org/current/userguide/build_lifecycle.html_ -------------------------------------------------------------------------------- /14-lifecycle/base/src/main/resources/basefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/14-lifecycle/base/src/main/resources/basefile -------------------------------------------------------------------------------- /14-lifecycle/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | println "build script block -> ${halu} -> " 3 | } 4 | 5 | project.beforeEvaluate { 6 | println '[hook] - 配置阶段开始前,build.gradle解析前.' 7 | } 8 | 9 | project.afterEvaluate { 10 | println '[hook] - 配置阶段完成后,build.gradle解析后.' 11 | } 12 | 13 | gradle.taskGraph.whenReady { graph -> 14 | println "[hook] - 关系图已确认,执行阶段开始前" 15 | } 16 | 17 | gradle.buildFinished { result -> 18 | println "[hook] - 构建完成后" 19 | } 20 | 21 | println '[配置阶段] - 配置阶段 00.' 22 | 23 | task configured { 24 | println '[配置阶段] - 配置阶段 01.' 25 | } 26 | 27 | task test { 28 | doFirst { 29 | println '[执行阶段] - 最先做.' 30 | } 31 | doLast { 32 | println '[执行阶段] - 最后做.' 33 | } 34 | println '[配置阶段] 任务.' 35 | } -------------------------------------------------------------------------------- /14-lifecycle/gradle.properties: -------------------------------------------------------------------------------- 1 | halu=halu -------------------------------------------------------------------------------- /14-lifecycle/main/src/main/resources/webapp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/14-lifecycle/main/src/main/resources/webapp -------------------------------------------------------------------------------- /14-lifecycle/settings.gradle: -------------------------------------------------------------------------------- 1 | include 'base','main' 2 | 3 | println "< ---- [初始化阶段] ---- > " 4 | 5 | def initFunc(){ 6 | println "<-- [初始化阶段] - 自定义方法 -->" 7 | } 8 | 9 | initFunc() -------------------------------------------------------------------------------- /15-kotlin/00-spring_boot/README.MD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/15-kotlin/00-spring_boot/README.MD -------------------------------------------------------------------------------- /15-kotlin/00-spring_boot/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "org.jetbrains.kotlin.jvm" version "1.1.3-2" 3 | } 4 | 5 | ext{ 6 | kotlin_version = "1.1.3-2" 7 | bootVersion = "1.5.6.RELEASE" 8 | tomcat_embed = "8.5.4" 9 | } 10 | 11 | repositories { 12 | mavenLocal() 13 | maven { url"https://repo.spring.io/libs-release" } 14 | jcenter() 15 | mavenCentral() 16 | } 17 | 18 | // 依赖配置 19 | dependencies { 20 | // kotlin标准库支持 21 | compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 22 | // 编译成java8规范字节码 23 | compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 24 | 25 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 26 | "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}" 27 | } -------------------------------------------------------------------------------- /15-kotlin/00-spring_boot/src/main/kotlin/org/pkaq/Booter.kt: -------------------------------------------------------------------------------- 1 | package org.pkaq 2 | 3 | import org.springframework.boot.CommandLineRunner 4 | import org.springframework.boot.autoconfigure.SpringBootApplication 5 | import org.springframework.stereotype.Controller 6 | import org.springframework.web.bind.annotation.RequestMapping 7 | 8 | @SpringBootApplication 9 | @Controller 10 | open class Booter:CommandLineRunner{ 11 | @Throws(Exception::class) 12 | override fun run(vararg args: String) { 13 | println(" --- --- --- [ web started ] --- --- --- ") 14 | } 15 | 16 | @RequestMapping("/") 17 | fun index():String { 18 | return "index" 19 | } 20 | } 21 | 22 | fun main(args: Array) { 23 | org.springframework.boot.SpringApplication.run(org.pkaq.Booter::class.java, *args) 24 | } -------------------------------------------------------------------------------- /15-kotlin/00-spring_boot/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | mvc: 3 | date-format: yyyy-MM-dd 4 | view: 5 | prefix: /web/ 6 | suffix: .jsp 7 | server: 8 | context-path: / 9 | port: 80 -------------------------------------------------------------------------------- /15-kotlin/00-spring_boot/src/main/webapp/web/index.jsp: -------------------------------------------------------------------------------- 1 | Hello world -------------------------------------------------------------------------------- /16-plugin-java/0-fatjar/README.MD: -------------------------------------------------------------------------------- 1 | 过程比较简单,主要是将依赖一起打包到jar中 ,直接撸代码 2 | ```groovy 3 | //基于Gradle 4.1 4 | //pkaq.org 5 | 6 | apply plugin: 'java' 7 | 8 | def mainClassName = "Tiger" 9 | //仓库 10 | repositories { 11 | maven { url"https://repo.spring.io/libs-release" } 12 | } 13 | //依赖,为了确定依赖都打入jar包,这里随便添加了一个dom4j 14 | dependencies { 15 | compile "dom4j:dom4j:1.6.1" 16 | } 17 | //打包 18 | task runnbaleJar(type: Jar) { 19 | from files(sourceSets.main.output.classesDirs) 20 | from configurations.runtime.asFileTree.files.collect { zipTree(it) } 21 | 22 | manifest { 23 | attributes 'Main-Class': mainClassName 24 | } 25 | } 26 | ``` -------------------------------------------------------------------------------- /16-plugin-java/0-fatjar/build.gradle: -------------------------------------------------------------------------------- 1 | //基于Gradle 4.1 2 | //pkaq.org 3 | 4 | apply plugin: 'java' 5 | 6 | def mainClassName = "Tiger" 7 | //仓库 8 | repositories { 9 | maven { url"https://repo.spring.io/libs-release" } 10 | } 11 | //依赖,为了确定依赖都打入jar包,这里随便添加了一个dom4j 12 | dependencies { 13 | compile "dom4j:dom4j:1.6.1" 14 | } 15 | //打包 16 | task runnbaleJar(type: Jar) { 17 | from files(sourceSets.main.output.classesDirs) 18 | from configurations.runtime.asFileTree.files.collect { zipTree(it) } 19 | 20 | manifest { 21 | attributes 'Main-Class': mainClassName 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /16-plugin-java/0-fatjar/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | 9 | public static void main(String[] args) { 10 | System.out.println("PKAQ"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /17-plugin-checkstyle/CheckStyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | -------------------------------------------------------------------------------- /17-plugin-checkstyle/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | //所有项目共用一个checkstyle配置 3 | checkstyle { 4 | configFile = file("${rootDir}/CheckStyle.xml") 5 | ignoreFailures = true 6 | //采用最新版会报错 7 | //toolVersion = "7.1" 8 | } 9 | -------------------------------------------------------------------------------- /17-plugin-checkstyle/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Tiger say hi 3 | */ 4 | public class Tiger { 5 | public static void sayHi(){ 6 | System.out.println("Hi~"); 7 | } 8 | 9 | public static void main(String[] args) { 10 | System.out.println("PKAQ"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /18-plugin-pmd/00.pmd/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | apply plugin: 'pmd' 3 | 4 | ext { 5 | p3c = "1.3.0" 6 | } 7 | 8 | pmd { 9 | consoleOutput = true 10 | reportsDir = file("build/reports/pmd") 11 | ignoreFailures = true 12 | 13 | ruleSets = [ 14 | "java-ali-comment", 15 | "java-basic" 16 | ] 17 | } 18 | 19 | repositories { 20 | jcenter() 21 | } 22 | 23 | dependencies { 24 | pmd "com.alibaba.p3c:p3c-pmd:${p3c}" 25 | } -------------------------------------------------------------------------------- /18-plugin-pmd/00.pmd/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | import java.util.HashMap; 2 | import java.util.Map; 3 | 4 | /** 5 | * Tiger say hi 6 | */ 7 | public class Tiger { 8 | public static void sayHi(){ 9 | System.out.println("Hi~"); 10 | } 11 | 12 | public void hmap(){ 13 | Map mp = new HashMap();//新建map 14 | //int a=1 15 | //int b=2 16 | try{}catch(Exception e){} 17 | if(true){} 18 | } 19 | public static void main(String[] args) { 20 | System.out.println("PKAQ"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /18-plugin-pmd/01.alipmd/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | apply plugin: 'pmd' 3 | 4 | ext { 5 | p3c = "1.3.0" 6 | } 7 | 8 | pmd { 9 | consoleOutput = true 10 | reportsDir = file("build/reports/pmd") 11 | 12 | ruleSets = [ 13 | "java-ali-comment" 14 | ] 15 | } 16 | 17 | repositories { 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | pmd "com.alibaba.p3c:p3c-pmd:${p3c}" 23 | } -------------------------------------------------------------------------------- /18-plugin-pmd/01.alipmd/src/main/java/Tiger.java: -------------------------------------------------------------------------------- 1 | import java.util.HashMap; 2 | import java.util.Map; 3 | 4 | /** 5 | * Tiger say hi 6 | */ 7 | public class Tiger { 8 | public static void sayHi(){ 9 | System.out.println("Hi~"); 10 | } 11 | 12 | public void hmap(){ 13 | Map mp = new HashMap();//新建map 14 | //int a=1 15 | //int b=2 16 | } 17 | public static void main(String[] args) { 18 | System.out.println("PKAQ"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /19-plugin-jib/README.MD: -------------------------------------------------------------------------------- 1 | [![experimental](http://badges.github.io/stability-badges/dist/experimental.svg)](http://github.com/badges/stability-badges) 2 | [![Gradle Plugin Portal](https://img.shields.io/badge/gradle%20plugin-v0.9.2-blue.svg)](https://plugins.gradle.org/plugin/com.google.cloud.tools.jib) 3 | [![Gitter version](https://img.shields.io/gitter/room/gitterHQ/gitter.svg)](https://gitter.im/google/jib) 4 | 5 | # Jib - 容器化你的Gradle Java项目,jib快速入门 6 | 7 | - 原文: https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#quickstart 8 | - 翻译: flyingghost 9 | - 校对: PKAQ 10 | 11 | Jib 是一个用来为你的Java应用构建Docker和OCI镜像的 [Gradle](https://gradle.org/) 插件。 12 | 13 | Jib的项目信息,可以戳 [Jib project README](../README.md). 14 | jib的Maven插件,可以戳 [jib-maven-plugin project](../jib-maven-plugin). 15 | 16 | ## 即将实现的功能 17 | 18 | 以下功能目前尚未支持,但在未来的版本中会加入进来。 19 | 20 | - Support for WAR 格式的支持 21 | - 运行和调试构建好的容器 22 | 23 | ## 快速入门 24 | 25 | ### Setup 26 | 27 | *首先确保你使用的Gradle版本为4.6以上。* 28 | 29 | 在你的 Gradle Java 项目里,添加jib插件到 `build.gradle`: 30 | 31 | ```groovy 32 | plugins { 33 | id 'com.google.cloud.tools.jib' version '0.9.2' 34 | } 35 | ``` 36 | 37 | *戳 [Gradle Plugin Portal](https://plugins.gradle.org/plugin/com.google.cloud.tools.jib) 可以了解更多细节。* 38 | 39 | 然后你就可以用一条命令容器化你的应用: 40 | 41 | ```shell 42 | gradle jib --image= 43 | ``` 44 | 45 | 这条命令可以把你的应用构建成镜像并且推送到容器镜像服务。 *如果你遇到鉴权相关的问题,可以看看 [Authentication Methods](#authentication-methods).* 46 | 47 | 使用创建一个Docker守护进程: 48 | 49 | ```shell 50 | gradle jibDockerBuild 51 | ``` 52 | 53 | 如果你想把Jib作为你Gradle构建的一部分,请往下看。 54 | 55 | ## 配置 56 | 57 | 配置镜像推送: 58 | 59 | #### 使用 [Google Container Registry (GCR)](https://cloud.google.com/container-registry/)... 60 | 61 | *确保已经安装了 [`docker-credential-gcr`命令行工具](https://cloud.google.com/container-registry/docs/advanced-authentication#docker_credential_helper). Jib 将自动调用 `docker-credential-gcr` 命令来获取凭证。 戳 [Authentication Methods](#authentication-methods) 可以看到其他认证方式。* 62 | 63 | 举个栗子,想构建 `gcr.io/my-gcp-project/my-app` 的镜像,配置文件这么写: 64 | 65 | ```groovy 66 | jib.to.image = 'gcr.io/my-gcp-project/my-app' 67 | ``` 68 | 69 | #### 使用 [Amazon Elastic Container Registry (ECR)](https://aws.amazon.com/ecr/)... 70 | 71 | *确保已经安装了 [`docker-credential-ecr-login`命令行工具](https://github.com/awslabs/amazon-ecr-credential-helper). Jib 将自动调用 `docker-credential-ecr-login` 命令来获取凭证。 戳 [Authentication Methods](#authentication-methods) 可以看到其他认证方式。* 72 | 73 | 举个栗子, 想构建 `aws_account_id.dkr.ecr.region.amazonaws.com/my-app` 的镜像,配置文件这么写: 74 | 75 | ```groovy 76 | jib.to.image = 'aws_account_id.dkr.ecr.region.amazonaws.com/my-app' 77 | ``` 78 | 79 | #### 使用 [Docker Hub Registry](https://hub.docker.com/)... 80 | 81 | *确保已经安装了 [docker-credential-helper](https://github.com/docker/docker-credential-helpers#available-programs) 。 例如,在MacOS系统,凭据助手(credential helper)命令是 `docker-credential-osxkeychain`. 戳 [Authentication Methods](#authentication-methods) 可以看到其他认证方式。* 82 | 83 | 举个栗子, 想构建 `my-docker-id/my-app` 镜像,配置文件这么写: 84 | 85 | ```groovy 86 | jib.to.image = 'my-docker-id/my-app' 87 | ``` 88 | 89 | ##### TODO: 为常见的镜像服务添加更多范例。 90 | 91 | ### 构建你的镜像 92 | 93 | 使用如下命令构建你的容器镜像: 94 | 95 | ```shell 96 | gradle jib 97 | ``` 98 | 99 | 在第一次构建之后,后续的构建过程会快很多。 100 | 101 | 如果你遇到了任何困难,欢迎提交issue或者在[Gitter](https://gitter.im/google/jib), [Jib users forum](https://groups.google.com/forum/#!forum/jib-users)上来寻求帮助。 102 | 103 | #### 构建为Docker守护进程 104 | 105 | Jib 还可以直接把你的镜像构建成为Docker守护进程。 这会调用 `docker` 命令,所以需要你的 `docker` 命已经在 `PATH` 环境变量里设置好了。 106 | 107 | ```shell 108 | gradle jibDockerBuild 109 | ``` 110 | 111 | 如果你正在使用 [`minikube`](https://github.com/kubernetes/minikube) 的远程Docker镜像,确保你已经 [正确设置了环境变量](https://github.com/kubernetes/minikube/blob/master/docs/reusing_the_docker_daemon.md) 指向远程守护进程。: 112 | 113 | ```shell 114 | eval $(minikube docker-env) 115 | gradle jibDockerBuild 116 | ``` 117 | 118 | ### 对每一个构建都运行 `jib` 119 | 120 | 你也可以通过设置`build`任务的依赖关系,使得每一次构建都会自动运行 `jib` 。 121 | 122 | ```groovy 123 | tasks.build.dependsOn tasks.jib 124 | ``` 125 | 126 | 然后, ```gradle build``` 命令将会构建并且容器化你的应用。 127 | 128 | ### 导出dockerfile 129 | 130 | Jib 可以导出一份dockerfile,需要的时候你可以用Docker来完成构建。 131 | 132 | ```shell 133 | gradle jibExportDockerContext 134 | ``` 135 | 136 | 默认dockerfile将会创建并保存在 `build/jib-docker-context` 。你可以通过 `targetDir` 配置项或者命令行的 `---jib.dockerDir` 参数来修改这个保存路径: 137 | 138 | ```shell 139 | gradle jibExportDockerContext --jib.dockerDir=my/docker/context/ 140 | ``` 141 | 142 | 然后可以使用Docker来构建你的镜像。 143 | 144 | ```shell 145 | docker build -t myimage my/docker/context/ 146 | ``` 147 | 148 | ## 扩展用法 149 | 150 | 插件为配置文件增加了 `jib` 扩展项,它拥有以下配置参数,可用来定制化镜像构建过程: 151 | 152 | | 字段 | 类型 | 默认值 | 描述 | 153 | | ------------------------- | --------------------------------- | -------------------------------------- | ------------------------------------------------------------ | 154 | | `from` | [`from`](#from-closure) | 参考 [`from`](#from-closure) | 设置将在什么基础镜像之上构建应用 | 155 | | `to` | [`to`](#to-closure) | *Required* | 设置目标镜像 | 156 | | `container` | [`container`](#container-closure) | 参考 [`container`](#container-closure) | 设置将要运行镜像的容器 | 157 | | `useProjectOnlyCache` | `boolean` | `false` | 如果设为true,Jib将不会在不同的Maven项目之间共享缓存 | 158 | | `allowInsecureRegistries` | boolean | `false` | 如果设为true,Jib在镜像仓储不支持HTTPS的时候使用HTTP作为备用方案。强烈建议把这个参数设为false,否则,和没开HTTPS的镜像仓储之间的通讯流量不会被加密,容易被偷窥。 | 159 | 160 |
`from` 是一个包含以下属性的闭包: 161 | 162 | | 属性 | 类型 | 默认值 | 描述 | 163 | | ------------ | ----------------------- | ------------------------ | ------------------------------------------------------------ | 164 | | `image` | `String` | `gcr.io/distroless/java` | 指向基础镜像 | 165 | | `credHelper` | `String` | *None* | 拉取基础镜像的时候,用于完成鉴权环节的凭据助手(credential helper)命令行工具的**后缀** ( `docker-credential-`后面部分). | 166 | | `auth` | [`auth`](#auth-closure) | *None* | 直接指定鉴权信息 (替代 `credHelper` 方式)。 | 167 | 168 | `to` 是一个包含以下属性的闭包: 169 | 170 | | 属性 | 类型 | 默认值 | 描述 | 171 | | ------------ | ----------------------- | ---------- | ------------------------------------------------------------ | 172 | | `image` | `String` | *Required* | 指向目标镜像。也可以通过命令行的 `--image` 参数来指定。 | 173 | | `credHelper` | `String` | *None* | 拉取基础镜像的时候,用于完成鉴权环节的凭据助手(credential helper)命令行工具的**后缀** ( `docker-credential-`后面部分)。
注:怀疑是原文档写错了,猜测应该是构建好的镜像要推(push)到的地方才对。原文如下:
Suffix for the credential helper that can authenticate pulling the base image (following `docker-credential-`). | 174 | | | | | | 175 | | `auth` | [`auth`](#auth-closure) | *None* | 直接指定鉴权信息 (替代 `credHelper` 方式)。 | 176 | 177 | `auth` 是一个包含以下属性的闭包 (参考 [Using Specific Credentials](#using-specific-credentials)): 178 | 179 | | 属性 | 类型 | 180 | | ---------- | -------- | 181 | | `username` | `String` | 182 | | `password` | `String` | 183 | 184 | `container` 是一个包含以下属性的闭包: 185 | 186 | | 属性 | 类型 | 默认值 | 描述 | 187 | | ----------- | -------------- | ------------ | ------------------------------------------------------------ | 188 | | `jvmFlags` | `List` | *None* | 运行应用时需要传递给JVM的额外附加参数 | 189 | | `mainClass` | `String` | *Inferred\** | 启动应用的入口main class | 190 | | `args` | `List` | *None* | 运行应用时传入默认main方法的参数 | 191 | | `ports` | `List` | *None* | 容器在运行时对外暴露的端口号(等价于Docker的[EXPOSE](https://docs.docker.com/engine/reference/builder/#expose)指令)。 | 192 | | `format` | `String` | `Docker` | 使用 `OCI` 构建一个 [OCI 容器镜像](https://www.opencontainers.org/). | 193 | 194 | *\* 使用在 `jar` 任务中定义的main class,或者尝试搜索到一个可用的main class。* 195 | 196 | ### 范例 197 | 198 | 在以下示例配置中,镜像文件将: 199 | 200 | - 基于基础镜像 `openjdk:alpine` 构建(从 Docker Hub拉取) 201 | - 推到 `localhost:5000/my-image:built-with-jib` 202 | - 使用命令行 `java -Xms512m -Xdebug -Xmy:flag=jib-rules -cp app/libs/*:app/resources:app/classes mypackage.MyApp some args` 运行应用 203 | - 暴露TCP端口 1000 (默认),以及UDP端口 2000, 2001, 2002, 2003 204 | - 构建为 OCI 标准格式 205 | 206 | ```groovy 207 | jib { 208 | from { 209 | image = 'openjdk:alpine' 210 | } 211 | to { 212 | image = 'localhost:5000/my-image/built-with-jib' 213 | credHelper = 'osxkeychain' 214 | } 215 | container { 216 | jvmFlags = ['-Xms512m', '-Xdebug', '-Xmy:flag=jib-rules'] 217 | mainClass = 'mypackage.MyApp' 218 | args = ['some', 'args'] 219 | ports = ['1000', '2000-2003/udp'] 220 | format = 'OCI' 221 | } 222 | } 223 | ``` 224 | 225 | ### 鉴权方法 226 | 227 | 从私有镜像仓储推/拉镜像需要认证授权。 这项工作可以使用 [Docker 凭据助手(credential helpers) 来协助完成](#using-docker-credential-helpers)。如果你没有明确指定凭据, Jib 会尝试 [使用在Docker配置中定义的凭据](/../../issues/101) ,或者尝试在常见的凭据助手(credential helpers)中瞎猜一个。 228 | 229 | #### 使用 Docker 凭据助手(Credential Helpers) 230 | 231 | Docker 凭据助手(Credential Helpers) 是一组针对各种镜像仓储用来处理鉴权问题的命令行工具。 232 | 233 | 常见凭据助手包括: 234 | 235 | - Google Container Registry: [`docker-credential-gcr`](https://cloud.google.com/container-registry/docs/advanced-authentication#docker_credential_helper) 236 | - AWS Elastic Container Registry: [`docker-credential-ecr-login`](https://github.com/awslabs/amazon-ecr-credential-helper) 237 | - Docker Hub Registry: [`docker-credential-*`](https://github.com/docker/docker-credential-helpers) 238 | 240 | 241 | 在 `jib` 扩展中,可以通过 `credHelper` 属性指定镜像仓储要使用的凭据助手。 242 | 243 | *示例配置:* 244 | 245 | ```groovy 246 | jib { 247 | from { 248 | image = 'aws_account_id.dkr.ecr.region.amazonaws.com/my-base-image' 249 | credHelper = 'ecr-login' 250 | } 251 | to { 252 | image = 'gcr.io/my-gcp-project/my-app' 253 | credHelper = 'gcr' 254 | } 255 | } 256 | ``` 257 | 258 | #### 使用明确的鉴权信息 259 | 260 | 你也可以在 `from` 或者 `to` 里直接指定镜像使用的凭据。 261 | 262 | ```groovy 263 | jib { 264 | from { 265 | image = 'aws_account_id.dkr.ecr.region.amazonaws.com/my-base-image' 266 | auth { 267 | username = USERNAME // Defined in 'gradle.properties'. 268 | password = PASSWORD 269 | } 270 | } 271 | to { 272 | image = 'gcr.io/my-gcp-project/my-app' 273 | auth { 274 | username = 'oauth2accesstoken' 275 | password = 'gcloud auth print-access-token'.execute().text.trim() 276 | } 277 | } 278 | } 279 | ``` 280 | 281 | 这些凭据信息可以存储在 `gradle.properties` 配置文件中,从命令行中接收 (例如 `gcloud auth print-access-token`),或者从文件中读取。 282 | 283 | 举个栗子,你可以读取一个key文件来完成认证。 (例如 GCR ,参考 [使用 JSON 密钥文件](https://cloud.google.com/container-registry/docs/advanced-authentication#using_a_json_key_file)): 284 | 285 | ```groovy 286 | jib { 287 | to { 288 | image = 'gcr.io/my-gcp-project/my-app' 289 | auth { 290 | username = '_json_key' 291 | password = file('keyfile.json').text 292 | } 293 | } 294 | } 295 | ``` 296 | 297 | ## Jib 是如何工作的 298 | 299 | 戳 [Jib project README](/../../#how-jib-works). 300 | 301 | ## 常见问题 (FAQ) 302 | 303 | 戳 [Jib project README](/../../#frequently-asked-questions-faq). 304 | 305 | ## 社区 306 | 307 | 戳 [Jib project README](/../../#community). -------------------------------------------------------------------------------- /19-plugin-jib/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.google.cloud.tools.jib' version '0.9.2' 3 | } 4 | //应用插件 5 | apply plugin: 'java' 6 | 7 | 8 | //定义仓库 9 | repositories { 10 | jcenter() 11 | } 12 | 13 | //定义依赖 14 | dependencies { 15 | compile "cn.pkaq:ptj.tiger:+" 16 | } 17 | 18 | -------------------------------------------------------------------------------- /19-plugin-jib/src/main/java/TigerSayHi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Leon on 2015/12/14. 3 | */ 4 | public class TigerSayHi { 5 | public static void main(String[] args) { 6 | Tiger.sayHi(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /20-plugin-proguard/README.md: -------------------------------------------------------------------------------- 1 | # 使用proguard混淆你的spring boot应用 2 | 3 | 4 | 5 | # Proguard介绍 6 | 7 |   安卓开发的同学想必对`Proguard`都是十分熟悉的,由于java的反编译实在是太容易,使用它可以对`java`源码进行混淆处理,这样即使反编译之后也极大的降低了源码的可读性。当然除了混淆,`proguard`还有其余一些功能。 8 | 9 | - shrink: 检测并移除没有用到的类,变量,方法和属性; 10 | 11 | - optimize: 优化代码,非入口节点类会加上`private`/`static`/`final`, 没有用到的参数会被删除,一些方法可能-会变成内联代码。 12 | 13 | - obfuscate: 使用短又没有语义的名字重命名非入口类的类名,变量名,方法名。入口类的名字保持不变。 14 | 15 | - preverify: 预校验代码是否符合Java1.6或者更高的规范(唯一一个与入口类不相关的步骤) 16 | 17 | 18 | 19 | ![proguard](./assets/proguard.png) 20 | 21 | # 环境准备 22 | 23 | - proguard plugin: 6.0.3 24 | 25 | - spring boot: 2.0.3 26 | 27 | - gradle 4.9 28 | 29 | - windows 10 30 | 31 | 32 | 33 | # 引言 34 | 35 |   普通`proguard`的使用方式非常简单,只要下载`proguard.jar`直接运行`java -jar proguard.jar @progurad.pro`即可。@后面指定的是规则文件。本篇着重讲解如何通过`gradle task`的方式来进行混淆打包。 36 | 37 |   这里以`spring boot`为例,当然这并非仅限于`spring boot`应用,只要明白了原理,所有`java`应用都可以如法炮制。最重要的是如何编制规则文件,需要特别注意的是用到反射的类不要进行混淆。 38 | 39 |   有人说后端java应用部署在服务器端,对代码进行混淆并没有太大意义,关于此点不在本文讨论范围之内,本文仅提供纯技术层面的探讨,喜者自取,恶者轻喷。 40 | 41 |    42 | 43 | # 步骤 44 | 45 | 引入方式有两种,第一种是自行下载后采用本地引用,第二种只直接去中央仓库加载依赖。 这里采用`法二`的方式 46 | 47 | 法一: 48 | 49 | ```groovy 50 | buildscript { 51 | repositories { 52 | flatDir dirs: '/usr/local/java/proguard/lib' 53 | } 54 | dependencies { 55 | classpath ':proguard:' 56 | } 57 | } 58 | ``` 59 | 60 | 法二: 61 | 62 | ```groovy 63 | buildscript { 64 | repositories { 65 | mavenCentral() 66 | } 67 | 68 | dependencies { 69 | classpath 'net.sf.proguard:proguard-gradle:6.0.3' 70 | } 71 | } 72 | ``` 73 | 74 | 75 | 76 |   具体做法比较简单,这里直接贴出完整构建文件如下 77 | 78 |   `spring boot plugin`的`bootjar`任务默认会打包所有`runtime` 期间的依赖以及`$builddir\classes`下的class文件,这里为了让`spring boot`从混淆后的class中打包,所以自定义了`bootPro`任务,该任务为`bootJar`类型任务(这里可以理解为继承)同时依赖于`proguard`任务,对`bootInf`方法进行了重写。如此可以在代码混淆后将混淆后的`class`文件打包到`jar`包中。 79 | 80 |   需要说明的是`Proguard`任务内部可以直接编写混淆规则,也可以引用外部规则文件,这里采用的是引用外部文件的方法。 具体规则可以参考文章尾部的`proguard`链接。 81 | 82 | ```groovy 83 | buildscript { 84 | repositories { 85 | mavenCentral() 86 | } 87 | 88 | dependencies { 89 | classpath 'net.sf.proguard:proguard-gradle:6.0.3' 90 | } 91 | } 92 | plugins { 93 | id 'org.springframework.boot' version '2.0.3.RELEASE' 94 | } 95 | 96 | import proguard.gradle.ProGuardTask 97 | import org.springframework.boot.gradle.tasks.bundling.BootJar 98 | 99 | apply plugin: 'io.spring.dependency-management' 100 | 101 | dependencies { 102 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 103 | "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}" 104 | compileOnly "org.projectlombok:lombok:1.16.10" 105 | 106 | compile project(":webpage") 107 | } 108 | 109 | // 不混淆打普通jar 110 | bootJar { 111 | mainClassName = 'org.pkaq.Booter' 112 | } 113 | // 混淆任务 114 | task proguard(type: ProGuardTask, dependsOn: compileJava) { 115 | // 输出混淆前->混淆后的映射 116 | printmapping "$buildDir/mapping.txt" 117 | // 混淆规则文件 118 | configuration 'proguard-rules.pro' 119 | 120 | // 混淆时依赖的库 121 | libraryjars files(configurations.compile.findAll {}.collect()) 122 | libraryjars "${System.getProperty('java.home')}/lib/rt.jar" 123 | libraryjars "${System.getProperty('java.home')}/lib/jce.jar" 124 | 125 | // 混淆输入 126 | injars sourceSets.main.output 127 | // 混淆输出 128 | outjars "$buildDir/classes-pro" 129 | } 130 | 131 | // 混淆打包 132 | task bootPro(type: BootJar){ 133 | dependsOn 'proguard' 134 | // 重新组织boot-inf下的文件 135 | bootInf { 136 | into('classes') { 137 | from "$buildDir/classes-pro" 138 | } 139 | 140 | into('lib') { 141 | from configurations.runtime 142 | } 143 | } 144 | // 包名 145 | baseName = "web" 146 | // 入口 147 | mainClassName = 'org.pkaq.Booter' 148 | // 删除混淆后的文件 避免下次混淆打包报错 149 | doLast { 150 | new File("$buildDir/classes-pro").deleteDir() 151 | } 152 | } 153 | ``` 154 | 155 | 156 | 157 | - [本文示例源码](https://github.com/GradleCN/GradleSide/tree/master/19-plugin-proguard) 158 | - [proguard](https://www.guardsquare.com/en/products/proguard/manual/gradle) 159 | - [Spring boot plugin API](https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/gradle-plugin/api/) 160 | - [Spring boot plugin BootJar doc](https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/gradle-plugin/reference/html/) -------------------------------------------------------------------------------- /20-plugin-proguard/assets/proguard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/20-plugin-proguard/assets/proguard.png -------------------------------------------------------------------------------- /20-plugin-proguard/build.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | bootVersion = "2.0.3.RELEASE" 3 | tomcat_embed = "8.5.4" 4 | } 5 | 6 | allprojects{ 7 | apply plugin: 'java' 8 | 9 | 10 | repositories { 11 | mavenLocal() 12 | jcenter() 13 | maven { url"https://repo.spring.io/libs-release" } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /20-plugin-proguard/settings.gradle: -------------------------------------------------------------------------------- 1 | include "webpage" 2 | include "webserver" 3 | 4 | -------------------------------------------------------------------------------- /20-plugin-proguard/webpage/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /20-plugin-proguard/webpage/src/main/resources/META-INF/resources/static/duke.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/20-plugin-proguard/webpage/src/main/resources/META-INF/resources/static/duke.jpg -------------------------------------------------------------------------------- /20-plugin-proguard/webpage/src/main/resources/META-INF/resources/web/tiger.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | Title 5 | 6 | 7 | j2ee
8 |
9 | <% 10 | String words = String.valueOf(request.getAttribute("words")); 11 | out.println("Tiger said : " + words); 12 | %> 13 | 14 | 15 | -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/Shakespeare..txt: -------------------------------------------------------------------------------- 1 | # 2 | # This obfuscation dictionary contains quotes from plays by Shakespeare. 3 | # It illustrates that any text can be used, for whatever flippant reasons 4 | # one may have. 5 | # Usage: 6 | # java -jar proguard.jar ..... -obfuscationdictionary shakespeare.txt 7 | # 8 | 9 | 10 | "This thing of darkness I acknowledge mine." 11 | 12 | --From The Tempest (V, i, 275-276) 13 | 14 | 15 | "Though this be madness, yet there is method in 't." 16 | 17 | --From Hamlet (II, ii, 206) 18 | 19 | 20 | "What's in a name? That which we call a rose 21 | By any other word would smell as sweet." 22 | 23 | --From Romeo and Juliet (II, ii, 1-2) -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenCentral() 4 | } 5 | 6 | dependencies { 7 | classpath 'net.sf.proguard:proguard-gradle:6.0.3' 8 | } 9 | } 10 | plugins { 11 | id 'org.springframework.boot' version '2.0.3.RELEASE' 12 | } 13 | 14 | import proguard.gradle.ProGuardTask 15 | import org.springframework.boot.gradle.tasks.bundling.BootJar 16 | 17 | apply plugin: 'io.spring.dependency-management' 18 | 19 | dependencies { 20 | compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}", 21 | "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}" 22 | compileOnly "org.projectlombok:lombok:1.16.10" 23 | 24 | compile project(":webpage") 25 | } 26 | 27 | // 不混淆打普通jar 28 | bootJar { 29 | mainClassName = 'org.pkaq.Booter' 30 | } 31 | // 混淆任务 32 | task proguard(type: ProGuardTask, dependsOn: compileJava) { 33 | // 输出混淆前->混淆后的映射 34 | printmapping "$buildDir/mapping.txt" 35 | // 混淆规则文件 36 | configuration 'proguard-rules.pro' 37 | 38 | // 混淆时依赖的库 39 | libraryjars files(configurations.compile.findAll {}.collect()) 40 | libraryjars "${System.getProperty('java.home')}/lib/rt.jar" 41 | libraryjars "${System.getProperty('java.home')}/lib/jce.jar" 42 | 43 | // 混淆输入 44 | injars sourceSets.main.output 45 | // 混淆输出 46 | outjars "$buildDir/classes-pro" 47 | } 48 | 49 | // 混淆打包 50 | task bootPro(type: BootJar){ 51 | dependsOn 'proguard' 52 | // 重新组织boot-inf下的文件 53 | bootInf { 54 | into('classes') { 55 | from "$buildDir/classes-pro" 56 | } 57 | 58 | into('lib') { 59 | from configurations.runtime 60 | } 61 | 62 | } 63 | // 包名 64 | baseName = "web" 65 | // 入口 66 | mainClassName = 'org.pkaq.Booter' 67 | 68 | doLast { 69 | new File("$buildDir/classes-pro").deleteDir() 70 | } 71 | } -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/compact.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This obfuscation dictionary contains strings that are already present 3 | # in many class files. Since these strings can be shared, the resulting 4 | # obfuscated class files will generally be a little bit more compact. 5 | # Usage: 6 | # java -jar proguard.jar ..... -obfuscationdictionary compact.txt 7 | # 8 | 9 | Code 10 | V 11 | I 12 | Z 13 | B 14 | C 15 | S 16 | F 17 | D 18 | L -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/directory.txt: -------------------------------------------------------------------------------- 1 | ī 2 | í 3 | ǐ 4 | ì 5 | é 6 | è 7 | à 8 | â 9 | ê 10 | û 11 | î 12 | ô 13 | ù 14 | ë -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/keywords.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This obfuscation dictionary contains reserved Java keywords. They can't 3 | # be used in Java source files, but they can be used in compiled class files. 4 | # Note that this hardly improves the obfuscation. Decent decompilers can 5 | # automatically replace reserved keywords, and the effect can fairly simply be 6 | # undone by obfuscating again with simpler names. 7 | # Usage: 8 | # java -jar proguard.jar ..... -obfuscationdictionary keywords.txt 9 | # 10 | 11 | do 12 | if 13 | for 14 | int 15 | new 16 | try 17 | byte 18 | case 19 | char 20 | else 21 | goto 22 | long 23 | this 24 | void 25 | break 26 | catch 27 | class 28 | const 29 | final 30 | float 31 | short 32 | super 33 | throw 34 | while 35 | double 36 | import 37 | native 38 | public 39 | return 40 | static 41 | switch 42 | throws 43 | boolean 44 | default 45 | extends 46 | finally 47 | package 48 | private 49 | abstract 50 | continue 51 | strictfp 52 | volatile 53 | interface 54 | protected 55 | transient 56 | implements 57 | instanceof 58 | synchronized -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -obfuscationdictionary 'directory.txt' 2 | -classobfuscationdictionary 'directory.txt' 3 | -packageobfuscationdictionary 'directory.txt' 4 | # 5 | -overloadaggressively 6 | 7 | # 不警告 8 | -dontwarn 9 | 10 | # 不理会警告,否则混淆失败 11 | -ignorewarnings 12 | 13 | # 不压缩 14 | -dontshrink 15 | 16 | # 不优化 17 | -dontoptimize 18 | 19 | # 一个类中的成员不使用重复的命名,如Student类混淆后不能出现a属性和a方法。 20 | -useuniqueclassmembernames 21 | 22 | # 不混淆注解 23 | -keepattributes *Annotation* 24 | 25 | # 不混淆泛型 26 | -keepattributes Signature 27 | 28 | # 保留程序入口 29 | -keep @org.springframework.boot.autoconfigure.SpringBootApplication class * {*;} 30 | 31 | # 不混淆枚举 32 | -keepclassmembers enum * { 33 | public static **[] values(); 34 | public static ** valueOf(java.lang.String); 35 | } -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/src/main/java/org/pkaq/Booter.java: -------------------------------------------------------------------------------- 1 | package org.pkaq; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.boot.CommandLineRunner; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | 9 | /** 10 | * @Description: 应用配置启动入口. 11 | * @FileName: Booter.java 12 | * @Author: S.PKAQ 13 | * @Version: 1.0 14 | * @Date: 2016年4月7日 上午9:28:07 15 | */ 16 | @SpringBootApplication 17 | @Slf4j 18 | public class Booter implements CommandLineRunner { 19 | /** 20 | * 入口函数. 21 | * @param args args 22 | */ 23 | @Autowired 24 | public static void main(String[] args) { 25 | SpringApplication.run(Booter.class, args); 26 | } 27 | 28 | public void run(String... args) throws Exception { 29 | log.info(" --- --- --- [ web started ] --- --- --- "); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/src/main/java/org/pkaq/web/controller/TigerCtrl.java: -------------------------------------------------------------------------------- 1 | package org.pkaq.web.controller; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.servlet.ModelAndView; 7 | 8 | /** 9 | * Created with IntelliJ IDEA. 10 | * Author: S.PKAQ 11 | * Datetime: 2016-12-01 16:33 12 | */ 13 | @Controller 14 | @Slf4j 15 | public class TigerCtrl { 16 | @RequestMapping("/") 17 | public ModelAndView tiger(){ 18 | log.info("Soft kitty,warm kitty Little ball of fur ."); 19 | return new ModelAndView("tiger","words","Roar ~ Roar ~ "); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | mvc: 3 | date-format: yyyy-MM-dd 4 | view: 5 | prefix: /web/ 6 | suffix: .jsp 7 | server: 8 | context-path: / 9 | port: 80 -------------------------------------------------------------------------------- /20-plugin-proguard/webserver/windows.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This obfuscation dictionary contains names that are not allowed as file names 3 | # in Windows, not even with extensions like .class or .java. They can however 4 | # be used without problems in jar archives, which just begs to apply them as 5 | # obfuscated class names. Trying to unpack the obfuscated archives in Windows 6 | # will probably generate some sparks. 7 | # Usage: 8 | # java -jar proguard.jar ..... -classobfuscationdictionary windows.txt 9 | # -packageobfuscationdictionary windows.txt 10 | # 11 | 12 | aux 13 | Aux 14 | aUx 15 | AUx 16 | auX 17 | AuX 18 | aUX 19 | AUX 20 | AUX 21 | con 22 | Con 23 | cOn 24 | COn 25 | coN 26 | CoN 27 | cON 28 | CON 29 | CON 30 | nul 31 | Nul 32 | nUl 33 | NUl 34 | nuL 35 | NuL 36 | nUL 37 | NUL 38 | NUL 39 | prn 40 | Prn 41 | pRn 42 | PRn 43 | prN 44 | PrN 45 | pRN 46 | PRN 47 | PRN 48 | com1 49 | Com1 50 | cOm1 51 | COm1 52 | coM1 53 | CoM1 54 | cOM1 55 | COM1 56 | COM1 57 | com2 58 | Com2 59 | cOm2 60 | COm2 61 | coM2 62 | CoM2 63 | cOM2 64 | COM2 65 | COM2 66 | com3 67 | Com3 68 | cOm3 69 | COm3 70 | coM3 71 | CoM3 72 | cOM3 73 | COM3 74 | COM3 75 | com4 76 | Com4 77 | cOm4 78 | COm4 79 | coM4 80 | CoM4 81 | cOM4 82 | COM4 83 | COM4 84 | com5 85 | Com5 86 | cOm5 87 | COm5 88 | coM5 89 | CoM5 90 | cOM5 91 | COM5 92 | COM5 93 | com6 94 | Com6 95 | cOm6 96 | COm6 97 | coM6 98 | CoM6 99 | cOM6 100 | COM6 101 | COM6 102 | com7 103 | Com7 104 | cOm7 105 | COm7 106 | coM7 107 | CoM7 108 | cOM7 109 | COM7 110 | COM7 111 | com8 112 | Com8 113 | cOm8 114 | COm8 115 | coM8 116 | CoM8 117 | cOM8 118 | COM8 119 | COM8 120 | com9 121 | Com9 122 | cOm9 123 | COm9 124 | coM9 125 | CoM9 126 | cOM9 127 | COM9 128 | COM9 129 | lpt1 130 | Lpt1 131 | lPt1 132 | LPt1 133 | lpT1 134 | LpT1 135 | lPT1 136 | LPT1 137 | LPT1 138 | lpt2 139 | Lpt2 140 | lPt2 141 | LPt2 142 | lpT2 143 | LpT2 144 | lPT2 145 | LPT2 146 | LPT2 147 | lpt3 148 | Lpt3 149 | lPt3 150 | LPt3 151 | lpT3 152 | LpT3 153 | lPT3 154 | LPT3 155 | LPT3 156 | lpt4 157 | Lpt4 158 | lPt4 159 | LPt4 160 | lpT4 161 | LpT4 162 | lPT4 163 | LPT4 164 | LPT4 165 | lpt5 166 | Lpt5 167 | lPt5 168 | LPt5 169 | lpT5 170 | LpT5 171 | lPT5 172 | LPT5 173 | LPT5 174 | lpt6 175 | Lpt6 176 | lPt6 177 | LPt6 178 | lpT6 179 | LpT6 180 | lPT6 181 | LPT6 182 | LPT6 183 | lpt7 184 | Lpt7 185 | lPt7 186 | LPt7 187 | lpT7 188 | LpT7 189 | lPT7 190 | LPT7 191 | LPT7 192 | lpt8 193 | Lpt8 194 | lPt8 195 | LPt8 196 | lpT8 197 | LpT8 198 | lPT8 199 | LPT8 200 | LPT8 201 | lpt9 202 | Lpt9 203 | lPt9 204 | LPt9 205 | lpT9 206 | LpT9 207 | lPT9 208 | LPT9 209 | LPT9 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 PKAQ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GradleSide 2 | ### Gradle 示例大全 3 | 4 | 广告 如果你喜欢gradle,我们有一个群 109752483 5 | 6 | 示例的内容对你而言或许过于基础,或许觉得冷门,但。。。 7 | 这些问题撸主都曾经真真的回答过遇到过 8 | 9 | **00.00** 潜规则 10 | 11 | **00.peer** peer not authenticated 错误的究极解决之道 12 | 13 | **03.buildscript** 14 | - 01 base 一个脚本结构示例 15 | - 02 extdepend 引入外部依赖进行构建 16 | - 17 | **04.repositories** 关于仓库的使用,多个仓库,自定义仓库,本地仓库... 18 | 19 | **05.dependencies** 依赖管理相关示例 20 | - 01 depbase 最简单的依赖管理示例 21 | - 02 local-dependency 使用本地文件系统依赖 22 | - 03 ptj 如何使用Gradle发布自己的项目到Jcenter 23 | - 04 deptree gradle依赖树-以树形结构查看相关依赖 24 | - 05 gradleCacheHome 更改gradle的缓存目录 25 | - 06 moduleVersion 使用版本号变量以及使用动态版本 26 | - 07 transitive 关于依赖传递,如何取消依赖传递以及如何排除个别依赖 27 | - 08 clientModule 操作依赖的依赖 28 | 29 | **06.task** gradle中的任务 30 | - 01 task 一个简单的配置型任务 31 | - 02 action 一个简单的动作型任务 32 | - 03 depends 任务依赖 33 | - 04 skip 任务跳过 34 | - 05 dynamic 动态任务 35 | - 06 inbuild 类型任务 36 | - 07 customTask 自定义任务 37 | 38 | 39 | **07.properties** 使用gradle操作properties 40 | 41 | **08.sourcesets** 自定义项目目录结构 42 | 43 | **09.multi-project** 44 | - 01 multi-project gradle多项目示例 45 | - 02 multi-project-springboot 结合spring boot构建采用公共jsp页面的多模块项目 46 | - 03 multi-project-flat 用水平布局的多模块(项目)项目构建 47 | - 04 multi-project-central 采用集中化配置的多模块(项目)项目构建,同时包括在settings文件中添加自定义代码 48 | 49 | **10.unicode** 各种乱码问题,中文注释编译报错,中文文件名编译报错,javadoc乱码等 50 | 51 | **11.resources** 打包src/main/java下的资源文件 52 | 53 | **12.specifyName** 打指定名称和版本号的jar包 54 | 55 | **13.env** 根据不同环境打包web项目 56 | 57 | **14.lifecycle** gradle构建的生命周期 58 | 59 | **15.kotlin** 60 | - 使用Gradle打包基于kotlin的spring boot项目 61 | 62 | **16.plugin-java** 63 | - 00 fatjar - 打可执行jar包 64 | 65 | **17.plugin-checkstyle** 代码风格检查 66 | 67 | **18.plugin-pmd** 68 | - 应用pmd插件使用阿里开发规范检查代码 69 | 70 | **19.plugin-jib**容器化你的Gradle Java项目,jib快速入门 71 | 72 | **20.plugin-proguard**使用proguard混淆你的sb应用 73 | -------------------------------------------------------------------------------- /ask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GradleCN/GradleSide/ee13132d098e293da4e3f5703e2533e4496ffb2b/ask.png --------------------------------------------------------------------------------