最近写 project,但线上发布需要使用 gradle,开发的时候并没有思考这件事,所以就埋了一个巨大的坑,本文描述一下这个恶心的过程,浪费了我一整天的时间。

一、安装指定版本的gradle

第一步其实可以不做,但是因为我这个网络实在是太烂了,让Intellij去下载 gradle 经常下崩,线上用了某版本的gradle,记为A 版本吧。

我是 Mac,推荐使用 brew 来进行这个操作,但是 brew 是无法安装老版本的,所以就需要找到那个特定的版本,搜了很多,这里提供一个比较笨的方法。

说一下 brew 的原理,brew install 其实是去寻找一个同名的 ruby 脚本,去执行一遍,这些 ruby 被存储在https://github.com/Homebrew/homebrew-core.git这个仓库里,找到里面的 gradle.rb 的修改历史,但由于这个仓库过于大,网页上不让操作,所以只能 clone 下来本地操作,这个就很恶心了,需要花费硬盘空间和网速。

之后拿到那个特定分支的 rb 文件,

brewinstallgradle.rb 即可。

二、将pom转为build.gradle

gradle 本身提供这个操作,命令是

gradleinit--typepom ,就会根据pom.xml自动生成

build.gradle  和

settings.gradle 。但这玩意似乎挺破的,遇到不认识的、不常见的标签,就直接跳过了,所以语意可能会改变,需要手动 patch 一些东西。

以我这个项目为例,是 Java 项目,maven 编译时候先按照规则生成一些 java 文件,这些 java 文件将来会当做源码来处理。

坑就在这个地方,这部分代码是没有被 gradle 自动生成的,直接使用会出现 ClassNotFound 的问题,所以我们不能直接删掉 pom.xml,需要借助它替我们生成一些代码。

暂时的解决方案就是,把这些生成出来的 java 文件也添加到git仓库里,反正也不大。

但这样操作之后仍然是 ClassNotFound,搜索发现代码明明在里面,所以应该是没找到,发现是 pom 里的 sourceSets 没有被加到gradle里,所以也要手动加。这个故事告诉我们,一定要把 pom 里的主要逻辑都移植过去,自动初始化很蠢的。

加完之后,就没有问题了,ok,算是解决了,进入下一个坑。

三、项目依赖的移植

在 pom 的依赖里,曾经是多个项目放在同一个目录下,pom.xml里用

subA

subB

subC

1

2

3

4

5

subA

subB

subC

这样subA/B/C就可以相互访问到了,很简洁。

A、B、C 是可以相互知道对方的存在的,假设C 依赖 A 和 B,那么直接在C 的pom.xml里,写好 A 和 B 的 groupId 和 artifactId 和 版本号即可,不需要额外操作。优先从本地获取模块。

但是 gradle 这样做是不行的,就算在 build.gradle 里写的是 A 和 B 的信息,但也不会从本地拿,而是尝试从网络上搜索 A 和 B。

最终的解决方案有两个,一个是使用平级依赖,一个是使用发布 maven 到本地这个功能。

先说平级依赖,settingsC.gradle里要写明 A 和 B,使用

includeFlat("subA")

1

includeFlat("subA")

即可,这时候可以用

":subA" 来表示 moduleA。

之后修改 buildC.gradle 里的内容,在dependencies里加入

compile project(":subA")

1

compileproject(":subA")

就会将 moduleA 加入到依赖中。

嗯,在 Intellij 的右侧可以正常发现这个模块了。

再说第二个方法,将 maven 仓库发布到本地。需要借助名叫

maven-publishing  的gradle 插件,之后使用

publishingToMavenLocal  即可在本地临时发布,之后按照最常用的方式导入即可。但是存在缺点,每次都要手动来发布一遍很烦,所以推荐使用第一种方法。

再插播一个小 tips,在最外层的 settings.gradle 里包含 subA 和 subB的时候,默认是去找 subA 这个目录,可以通过这句话来指定文件夹。

include(":subA")

project(":subA").projectDir = new File(settingsDir, 'path/to/subA')

1

2

include(":subA")

project(":subA").projectDir=newFile(settingsDir,'path/to/subA')

四、ban 掉 test

这步也不是必须的,但是作为开发者,我并不关心我依赖的库是否 test 通过了,关我屁事,所以可以使用这个语句来关掉。

tasks.withType(Test) {enable=false;}

1

tasks.withType(Test){enable=false;}

其实不是我想关掉它,实在是因为依赖的 test 一直都过不去,懒得修好它,就直接 ban 掉吧,又不是不能用。

五、gradle 编译一个带有依赖的 jar 包(此处不大优雅,偶尔能用,推荐阅读另外一篇关于打包的文章)

默认情况下,调用 gradle jar 只会打包自己的代码,缺失所有的依赖库。这里推荐一款叫

com.github.johnrengelman.shadow  的插件。

apply plugin: 'com.github.johnrengelman.shadow'

sourceCompatibility = 1.8

buildscript {

repositories {

maven {

url "https://plugins.gradle.org/m2/"

}

}

dependencies {

classpath "com.github.jengelman.gradle.plugins:shadow:1.2.3"

}

}

shadowJar {

classifier = null

version = null

zip64 true

manifest {

attributes 'Main-Class': 'com.example.Main'

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

applyplugin:'com.github.johnrengelman.shadow'

sourceCompatibility=1.8

buildscript{

repositories{

maven{

url"https://plugins.gradle.org/m2/"

}

}

dependencies{

classpath"com.github.jengelman.gradle.plugins:shadow:1.2.3"

}

}

shadowJar{

classifier=null

version=null

zip64true

manifest{

attributes'Main-Class':'com.example.Main'

}

}

之后使用

gradleshadowJar 就可以拿到编译好的jar包了,里面是各种各样的 class 文件。

完结~~ gradle 基本操作,大神勿喷。。。

=============================================================

随着访客的增多,LeadroyaL在本站流量的开支越来越多了,曾经1元能用1个月,现在1元只能用3天。如果觉得本文帮到了你,希望能够为服务器的流量稍微打赏一点,谢谢!

gradle 的cas 转maven_Gradle 历险记(二):从 maven 到 gradle 迁移的一些坑相关推荐

  1. Android Gradle的基本概念梳理(二)

    前言 逐步整理的一系列的总结: Android Gradle插件开发初次交手(一) Android Gradle的基本概念梳理(二) Android 自定义Gradle插件的完整流程(三)       ...

  2. Maven和Gradle对比

    Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...

  3. PO-01,cas:1258323-36-2乙酰丙酮酸二(4-苯基-噻吩[3,2-C]吡啶-C2,N)合铱(III)

    PO-01,cas:1258323-36-2乙酰丙酮酸二(4-苯基-噻吩[3,2-C]吡啶-C2,N)合铱(III) 中文名称: 乙酰丙酮酸二(4-苯基-噻吩[3,2-C]吡啶-C2,N)合铱(III ...

  4. Gradle 2.0 用户指南翻译——第二十二章. 标准的 Gradle 插件

    翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...

  5. gradle打包流程(二)--- 进一步理解gradle

    一.gradle是什么 1.gradle是一个自动化构建工具. gradle是通过组织一系列task来最终完成自动化构建的,所以task是gradle里最重要的概念.以生成一个可用的apk为例,整个过 ...

  6. gradle 的cas 转maven_maven 转 gradle

    maven 转 gradle Gradle和Maven都是项目自动构建工具,编译源代码只是整个过程的一个方面,更重要的是,你要把你的软件发布到生产环境中来产生商业价值,所以,你要运行测试,构建分布.分 ...

  7. 从零开始,跟我一起做jblog项目(三)从Maven到Gradle

    从零开始,跟我一起做jblog项目(一)引言 从零开始,跟我一起做jblog项目(二)Maven 从零开始,跟我一起做jblog项目(三)从Maven到Gradle 上一节讲到项目构建工具Maven, ...

  8. gradle 失败 编译项目_maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法...

    Gradle编译时在本地仓库中如果没有发现依赖,就会从远程仓库中下载, 默认的远程仓库为 mavenCentral(),即 http://repo1.maven.org/maven2/往往访问速度特别 ...

  9. Zxing 的集成 ---- Maven 对应 Gradle 的写法

    刚刚想耍耍二维码,想到了zxing和zbar,又想到zxing是Google老爹的,想想就算了吧,虽然zbar快但是识别错误率也高不少.随手Google了下*zxing 集成*好像都是说什么拷贝项目到 ...

最新文章

  1. vs 2005 下载,再汉化---没想到是痛苦的过程
  2. Linux下MONO执行C#程序
  3. Kafka简介、安装
  4. python 字符串%和format_python基础任务二
  5. 工作318:uni-切换tabber修改状态修饰
  6. Python中字符串如何定义简单举例
  7. JavaScript变异与非变异数组方法
  8. 腾讯申请自动驾驶相关专利 可实现自动变道
  9. 什么是 COM编程技术?
  10. 7.大数据架构详解:从数据获取到深度学习 --- 批处理技术
  11. 任意多边形的面积(转)
  12. scanf 用法及陷阱(转)
  13. linux病毒扫描工具,linux病毒扫描工具ClamAV使用
  14. 基于人脸识别的课堂签到管理系统【学习三】
  15. IT英语中英文对照:著名的软件产品
  16. 微信小程序-菜谱APP
  17. ChatGPT版Office(Word/Excel/PPT)来了
  18. *5-2 CCF 2014-12-3 集合竞价
  19. 每日新闻:阿里、商汤设立人工智能实验室;美光科技收购英特尔股份;2019十大战略科技发展趋势;北京明年允许自动驾驶车辆开展测试...
  20. 《动手学深度学习》笔记---3.16

热门文章

  1. BCompare日志
  2. Matlab 矩阵计算例子
  3. fprintf与fwrite的区别
  4. python(matplotlib9)——animation动画
  5. Echarts地图初体验
  6. 安卓canvas设置HTML,安卓开发中view和canvas的理解
  7. mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题
  8. python正则表达式使用实例_正则表达式的基础知识,以及Python爬虫中的使用方法...
  9. Linux安装包deb和rpm格式,deb格式和rpm格式是什么?_网站服务器运行维护
  10. java 点允许没有反应 程序有main_我的java程序点击相应的button键没有反应?我想要实现的功能是点击“左齐”键,按钮左对齐,依此类推;...