Gradle:我们需要另一个构建工具吗?

在Java开发的早期,我们要么没有太多的构建工具需求,要么就使用了其他环境中的工具。 我仍然记得构建shell脚本并创建用于开发Java的文件。 生成文件特别有趣,因为这是一个在设计时就没有考虑Java的工具。 迁移到不同的操作系统环境也很困难。

那时我工作的地方是我们在Solaris上开发的,但是我们有一些项目在Windows和Solaris上都存在-这是我们发现并开始使用“新”语言的原因之一,至少在那时是新的。 这使得Shell脚本无法使用,并且使文件充其量变得困难。

当蚂蚁出来时,我们跳了起来。 就像我们使用的语言一样,它是跨平台的。 这对我们来说是一个巨大的利益。

我记得当Maven出现时,存在一些阻力,因为我们有Ant。 但是到了此时,一些项目已经变得足够大,足够复杂,以至于编写和维护Ant文件是一件痛苦的事情。 随着war文件的出现和从类路径中加载依赖项jar的出现,查找,下载和安装每个项目的所有依赖项jar也变得分心。 Maven的依赖管理承诺以及按惯例简化构建使该工具成为多个项目的必备工具。 多年来,我工作过的许多商店都接受了Maven为编程环境带来的功能。

于是问题就变成了:有了如此强大的工具,我们还需要其他工具吗?

作为说明,我将回到我成为程序员和从事建筑工作之前的日子。 因为我是公司所有者的儿子,所以我“得”在施工过程的所有领域工作。 我发现我真的很喜欢木锤。 它的手感很好,用它我可以轻松打出16便士的指甲。 所以我到处使用它; 我用它来做框架,铺上薄板岩,完成工作,盖屋顶,但在电气工作中却很少。

如果我使用了较轻的锤子,我很确定在密西西比州南部会有一些房屋,这些房屋的墙角散落的锤子把钉子钉得太深了(这是在板岩工作人员之前)用螺丝钉固定住片岩)。 我还看到了屋顶人员从使用屋顶锤获得了多少好处。 如果我用过一根手指,我的手指断裂感可能会少很多。 道德:即使每个问题看起来都像钉子,但并非所有的锤子都是解决问题的正确方法。

关于摇篮

我最近一直在研究Gradle构建工具。 立即让我脱颖而出的一件事是,构建文件不是XML,属性文件或任何其他仅配置文本文件。 这是一个Groovy脚本。 从本文的第一部分开始,我认为您可以说我已经有一段时间了。 在此之前,它是C和C ++。 基于C的语言,尤其是Java,对我来说是第二天性。 XML是我的代码输出的东西,或用于提供服务器或其他工具的配置。 我每天都在使用Java进行结构化方面的工作不如在Java中进行更多的工作。 我对Groovy感到很自在,因为它基于Java。

本文的目的不是要从Maven切换到Gradle,而是要解释为什么Gradle应该出现在您的工具带中。 史蒂夫·埃伯索尔(Steve Ebersole) 撰写了一篇很棒的文章,介绍了为何Hibernate出于自己的开发需求而从Maven迁移到Gradle。 在我看来,当您的项目可以或应该使用Maven约定时,Maven仍然是一个很好的工具。

这也不意味着是有关如何使用Gradle的教程。 已经有一些不错的入门场所,包括Gradle网站上的用户指南。

Gradle提供了与IDE的良好集成。 Netbeans的最新版本尤其适用于Gradle。 Gradle有一个更好的多模块构建系统,其插件系统功能强大且简单明了,就像编写插件一样。 在我看来,它是一个编写良好且成熟的构建工具。

一个实际的例子

对我而言,Gradle最强大的功能是脚本是代码。 确切地说,很时髦。 有时我们都会遇到对项目有一个要求的项目,这些要求将它们与其他项目区分开来。 有几次我编写了快速的Griffon项目来维护配置数据,否则我将不得不为其维护SQL脚本。 Griffon是一个Groovy快速桌面应用程序环境,用于生成可作为可运行JAR文件或applet部署的独立应用程序。 当我必须进行更改时,然后必须将其复制到我从中运行应用程序的目录中,或复制到网络中以供其他人运行。

Gradle允许我编写该逻辑构建脚本。 由于Gradle基于Groovy,因此它附带了所有Groovy以及Java的工具和库。 例如,添加一个Swing对话框来选择将JAR复制到哪个目录,然后进行复制,就像将代码添加到构建文件一样简单:

import javax.swing.JFileChooserdef dirDialog = new JFileChooser(dialogTitle: "Choose directory to copy jar to",fileSelectionMode: JFileChooser.DIRECTORIES_ONLY,approveButtonText: "Set directory",acceptAllFileFilterUsed: false
)task copyJar(type: Copy) {from 'build/libs/DocExample.jar'def targetDir = dirDialog.showSaveDialog()if(targetDir  == JFileChooser.APPROVE_OPTION )  {targetDir = dirDialog.getSelectedFile()into targetDir}
}

然后从您的IDE或命令行运行copyJar,执行任务以选择目录并复制文件。

好的,这可能有点虚构,但请考虑在构建过程中将文件通过FTP与服务器之间的相似要求。 您可以使用来自Jibble的SimpleFTP之类的东西来满足该要求。 由于此文件是作为JAR文件提供的,您可以将其放在类路径中,因此可以像在此使用JFileChooser一样,在构建脚本中简单地使用它。

总之, Gradle是功能强大且用途广泛的工具,应在工具带中占据一席之地。

参考: Gradle:我们需要另一个构建工具吗? 从我们的JCG合作伙伴 Rik Scarborough在Keyhole Software博客上获得。

翻译自: https://www.javacodegeeks.com/2013/09/gradle-do-we-need-another-build-tool.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

servlet简单概括总结

最近在看java web的相关内容,不管是整体还是细节,要学习的知识有很多,所以有一个好的学习体系非常重要。在阅读学习一些博客和教程中关于servlet的内容后,现将知识体系和自己的总结体会进行梳理,希望在更深入理解的同时…

jquery学习之-查找父元素方法parent() parents() closest()的区别

parent()、parents()与closest()方法两两之间有类似又有不同&#xff0c;本篇简短的区分一下这三个方法。通过本篇内容&#xff0c;大家将会在以后使用.parent()、parents()和closest()时不会显得无从下手。 我们直接看例子来来说明一下这三个方法的使用区别&#xff1a; <u…

二叉树的递归遍历与复制

1 #include <iostream>2 3 //定义树的数据结构4 struct BiTNode5 {6 int data;7 struct BiTNode *lchild, *rchild;8 };9 10 typedef struct BiTNode BiTNode;11 typedef struct BiTNode* BiTree;12 13 14 //前序遍历15 void preOrder(BiTNode *root)16 {17…

php超强后门在任意位置创建文件,php大马:.user.ini文件构成的超强PHP后门

这个估计很多同学看了不屑&#xff0c;认为是烂大街的东西了&#xff1a;那么我来个新的吧&#xff1a;。它比用的更广&#xff0c;不管是nginx/apache/IIS&#xff0c;只要是以fastcgi运行的php都可以用这个方法。我的nginx服务器全部是fpm/fastcgi&#xff0c;我的IIS php5.3…

CSS3-字体渐变色

示例&#xff1a;Maugers Blog <!DOCTYPE HTML> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>Maugers Blog</title><style type"text/css…

Restlet框架– Hello World示例

Restlet是用于Java平台的轻量级&#xff0c;全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输&#xff0c;数据格式和服务描述标准&#xff0c;例如HTTP和HTTPS&#xff0c;SMTP&#xff0c;XML&#xff0c;JSON&#xff0c;Atom和WAD…

BZOJ2809 dispatching 【可并堆】

题目分析&#xff1a; yy一下就知道了&#xff0c;合并用可并堆少个log。 代码&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 4 const int maxn 102000;5 6 int n,m;7 int b[maxn],c[maxn],l[maxn],sz[maxn];8 long long tot[maxn];9 int dis[maxn],v…

php ci 框架 扩展缓存类,CodeIgniter扩展核心类实例详解

本文实例讲述了CodeIgniter扩展核心类的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;CI中对核心类、辅助类和函数的扩展是相当方便的&#xff0c;配置文件中指定了subclass_prefix扩展前缀&#xff0c;默认为MY_&#xff0c;扩展时需要以该配置为前缀&#xff…

jQuery下如何使用Json传递数据

json的结构为&#xff1a; {\"data\":[{\"key1\":\"1\"},{\"key2\":\"2\"},{\"key3\":\"3\"}]} 因为要进行输出&#xff0c;所以里边加了转义符&#xff0c;希望大家不要在此迷惑。下边&#xff0c;我就…

七牛云

待续....转载于:https://www.cnblogs.com/tovictory/p/8647883.html

Servlet 3的异步Servlet功能

在深入了解什么是异步Servlet之前&#xff0c;让我们尝试了解为什么需要它。 假设我们有一个Servlet&#xff0c;处理时间很长&#xff0c;如下所示。 LongRunningServlet.java package com.journaldev.servlet;import java.io.IOException; import java.io.PrintWriter;impo…

简单却实用的的例子:Jquery获取 radio 选中后的文字

今天在 QQ 群里有朋友问到 jQuery 怎么获取选中 radio 后的文本&#xff0c;可见要熟练的使用 jQuery 应该很好的掌握 jQuery 选择器&#xff0c;下边就让我们简单看看这个问题。 首先&#xff0c;他给出的 HTML 示例如下&#xff1a; <input type"radio" id"…

excel的宏与VBA入门——代码调试

直接介绍重点&#xff1a; 常用的操作是导航栏的逐句与断点&#xff1a; 添加断点&#xff1a;调试->切换断点 单步运行&#xff1a;调试->逐句 查看变量的窗口&#xff1a;视图->本地窗口 转载于:https://www.cnblogs.com/jiangbei/p/9561352.html

php访问服务器文件路径,PHP与服务器文件系统的简单交互

1、php.ini中关于文件上传的设置指令2、文件上传过程(1)上传文件提交表单html代码&#xff1a;Adminstration - upoload new filesUpload new filesUpload a file(2)php处理上传文件代码①在php脚本中&#xff0c;需要处理的数据保存在超级变量数组$_FILES中&#xff0c;开启re…

泽西岛客户:测试外部呼叫

吉姆和我在上周一直在做一些工作&#xff0c;其中涉及调用neo4j的HA状态URI来检查实例是否是主/从属&#xff0c;并且我们一直在使用jersey-client 。 该代码大致如下所示&#xff1a; class Neo4jInstance {private Client httpClient;private URI hostname;public Neo4jInst…

django F和Q 关键字使用

F 的使用&#xff1a; 想给表里每个价格加上一百就要用上F&#xff0c;直接加是不行的。 转载于:https://www.cnblogs.com/wuheng-123/p/9561422.html

php酷狗音乐json,用php来搜索酷狗音乐

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼返回结果要使用$datajson_decode($json,true);转换为php array变量搜索歌曲&#xff1a;http://mobilecdn.kugou.com/api/v3/search/song?formatjson&keyword想象之中&page1&pagesize30返回实例&#xff1a;Array([st…

了解OutOfMemoryError

每当您发现自己盯着一个带有OutOfMemoryError的堆栈跟踪时&#xff0c;它应该都非常清晰。 该程序不再有肘部空间&#xff0c;并且由于缺少它而濒临死亡。 从10,000英尺或高管椅子上可能已经包含太多信息。 但是&#xff0c;那些必须构建或维护应用程序并弄清为什么会产生特定错…

jQuery之合成事件

jQuery提供一些方法将两种效果合并到一起&#xff0c;比如&#xff1a;mouseover、mouseout。 下面是一些案例&#xff1a; hover(over,out)一个模仿悬停事件&#xff08;鼠标移动到一个对象上面及移出这个对象&#xff09;的方法。这是一个自定义的方法&#xff0c;它为频繁使…

基础命令_1

避免误删除数据1.尽量把文件移动到 /tmp目录2.参数最小化 -f -rf3.-f或-fr放在命令最后#########################################################################################################################find 命令 <find(选项)(参数)> find命令用来在…