OneCoder


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

Gradle 使用Maven本地缓存库

发表于 2013-10-08

从Maven切换到Gradle,原有的几G的本地缓存库当然想继续使用。在用户手册中找到了答案。在50.6.3章节。

如果想使用Maven本地缓存,需要定义:

repositories {
    mavenLocal()
}

Gradle使用与Maven相同的策略去定位本地Maven缓存的位置。如果在settings.xml中定义了本地Maven仓库的地址,则使用该地址。在USER_HOME/.m2下的settings.xml文件中的配置会覆盖存放在M2_HOME/conf下的settings.xml文件中的配置。如果没有settings.xml配置文件,Gradle会使用默认的USER_HOME/.m2/repository地址。

阅读全文 »

《Gradle user guide》翻译 — 7.3 多工程Java构建

发表于 2013-09-24

现在我们来看一个典型的多项目构建的例子。下面是工程的布局:

样例7.10 多项目构建 - 分层布局

构建结构

multiproject/
 api/
 services/webservice/
 shared/

注意:本样例的代码可以在Gradle完整安装包的samples/java/multiproject目录下找到

这里我们有三个工程。api工程生成用于Java客户端访问XML webservice服务的JAR包。webservice工程是一个web应用,用于返回XML信息。shared工程包含了api和webservice工程共同使用的代码。

7.3.1 定义一个多项目构建

为了定义一个多项目构建,你需要创建一个配置文件(settings file)。该配置文件存放在源码树的根目录,指定了哪些项目需要包含在构建任务之中。该配置文件必须命名位settings.gradle。在本例中,我们使用一个简单的层次布局。下面是相关的配置文件:

样例7.11 多项目构建 - settings.gradle 文件

include "shared", "api","services:webservice", "services:shared"

更多关于配置文件的信息,可在第56章的多项目构建中找到。

7.3.2 常用配置

对于大多数的多项目构建来说,有一些对所有项目都常用的配置。在我们的样例中,我们使用一种叫做配置注入的技术,将这些通用配置定义在根项目中。这里,根项目就像一个容易,子项目在这种情况下覆盖了该容器中的元素 - 并注入了特殊的配置。这样,我们可以轻松的给所有归档定义清单内容和一些通用的依赖:

样例7.12 多项目构建 - 通用配置

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'
    repositories {
       mavenCentral()
}
    dependencies {
        testCompile 'junit:junit:4.11'
}
    version = '1.0'
    jar {
        manifest.attributes provider: 'gradle'
} }

注意到,我们的样例对每个子项目都应用Java插件。这意味着我们在之前部分看过的任务和配置属性对每个子项目都是可用的。因此,你可以通过在项目根路径执行gradle build命令给所有的工程进行编译,测试并打成JAR包。

7.3.3 项目间依赖

你可以在同一个构建中增加项目间的依赖,例如,一个项目的JAR包被用于另一个项目的编译。在api项目的构建文件中,我们将增加一个对shared工程JAR包的依赖。由于这个依赖的存在,Gradle将会确保shared工程总是在api项目之前先进行构建。

样例7.13 多项目构建 - 项目间依赖

dependencies {
    compile project(':shared')
}

关于如何关闭该功能,可参见第56.7.1章节的”关闭依赖项目的构建”部分。

7.3.4 创建一个分支

我们可以增加一个分支,用于打包给客户端使用:

样例7.14 多项目构建 - 分支文件

task dist(type: Zip) {
    dependsOn spiJar
    from 'src/dist'
    into('libs') {
        from spiJar.archivePath
        from configurations.runtime
    }
}
artifacts {
   archives dist
}
阅读全文 »

《Gradle user guide》翻译 — 7.2 一个基本的Java项目

发表于 2013-09-23

7.2 一个基本的Java项目

我们来看一个简单的例子。把下面的代码加入你的构建文件,以使用Java插件:

例子 7.1 使用Java插件

build.gradle
apply plugin: 'java'

注意:该样例的代码可在Gradle的安装包中的samples/java/quickstart路径下找到。

这就是你定义一个Java项目所需要做的一切。这就会在你项目里使用Java插件,该插件会给你的项目增加很多任务。

Gradle期望在src/main/java路径下找到你项目的源代码,并且测试在src/test/java路径下的代码。同时,在src/main/resources路径下的文件也会作为资源文件包含在JAR包中,并且src/test/resources下的所有文件会包含在classpath下以运行测试程序。所有的输出文件都生成在build目录下,JAR包生成在build/libs目录下。

7.2.1 编译项目

Java插件给你的项目构建增加很多任务。然而,只有屈指可数的任务你将会在构建项目的时候用到。最常用的任务是build任务,该任务会对项目执行完整的编译。当你运行gradle build的时候,Gradle会编译并测试你的代码,然后生成一个包含类和资源文件的JAR包。

例7.2 构建Java项目</div>

gradle build输出

> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs

其他一些有用的任务是:

clean
     清空build编译目录,删除所有构建文件。

assemble
     编译并给你的代码打包,但是不执行单元测试。其他的插件为本任务增加更多的特性支持。例如,如果你使用War插件,那么该任务也会给你的项目编译出War包。

check
     编译并测试代码。其他的插件会对该任务提供更多检测支持。例如,如果你使用Code-quality插件,那么该任务会同时对你的代码执行Checkstyle检测。

7.2.2 外部依赖

通常,一个Java项目会依赖一些外部的JAR文件。为了在项目中引用这些JAR文件,你需要告诉Gradle哪里可以找到它们。在Gradle里,JAR包等资源放在资源库(repository)中。资源库可以用来查找项目的依赖,也可以用于发布项目归档。在这个样例中,我们将使用公共的Maven库:

样例7.3 添加Maven库

repositories {
    mavenCentral()
}

我们来添加一些依赖。这里,我们会声明我们产品的类有在编译期依赖于commons collections,同时我们的测试类在编译期依赖于junit:

样例7.4 添加依赖

dependencies {
       compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
       testCompile group: 'junit', name: 'junit', version: '4.+'
}

更多的内容,可在第八章的依赖管理基础中找到。

7.2.3 自定义项目

Java插件给你的项目添加了许多属性。这些属性都有默认值,并且通常情况下这些默认值足以满足使用。如果这些值不满足要求,那么修改起来也是很容易的。我们来看一下例子。这里,我们将指定Java项目的版本号,同时指定我们编写代码所使用的Java版本。我们也会在JAR包的描述清单中(manifest)增加一些属性。

样例7.5 自定义MANIFEST.MF

sourceCompatibility = 1.5
   version = '1.0'
   jar {
       manifest {
           attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': versi
} }
什么属性是可用的?
你可以使用gradle properties命令去列出项目的属性。这可以让你看到Java插件添加的属性及其默认值。

Java插件添加的也是规则的任务,如果把它们声明在构建文件里也是完全一样的。这就意味这,你可以使用任何之前章节中介绍的机制去自定义这些任务。例如,你可以设置任务的属性,给任务增加行为,修改任务的依赖,或是完全的替代任务。在我们的样例中,我们将要配置test任务,该任务的类型是Test,当测试执行的时候增加一个系统属性:

样例7.6 增加一个测试系统属性

test {
    systemProperties 'property': 'value'
}

7.2.4 发布JAR包</div>

通常,JAR包需要被发布到某个地方。为了完成这个功能,你需要告诉Gradle把JAR包发布到哪里。在Gradle中,如JAR之类的压缩包都被发布到库中。在我们的样例中,我们将会发布到本地仓库。你也可以发布到一个或多个远端地址。

样例7.7 发布JAR包</div>

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
} }
}

执行gradle uploadArchives命令以发布JAR包。

7.2.5 创建Eclipse工程</div>

为了把你的项目导入到Eclipse,你需要在构建文件中增加其他插件:

样例 7.8 Eclipse 插件

apply plugin: 'eclipse'

现在执行gradle eclipse命令以生成Eclipse工程文件。更多关于Eclipse任务可以在第38章 Eclipse插件中看到。

7.2.6 概要

下面是完整的构建文件的样例:

样例7.9 Java样例-完整构建文件

   apply plugin: 'java'
   apply plugin: 'eclipse'
   sourceCompatibility = 1.6
   version = '1.0'
   jar {
       manifest {
           attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version'
   } }
  repositories {
       mavenCentral()
  }
   dependencies {
       compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
       testCompile group: 'junit', name: 'junit', version: '4.+'
  }
   test {
       systemProperties 'property': 'value'
   }
   uploadArchives {
       repositories {
          flatDir {
              dirs 'repos'
          } 
      }
  }

阅读全文 »

《Gradle user guide》翻译 — 第七章 Java快速开始

发表于 2013-09-21

7.1 Java插件 <p> 如我们所了解的,Gradle是一个通用的构建工具。它可以通过你的构建脚本实现几乎任何你想做的事情。不过,作为开箱即用的产品,它不会做任何构建脚本不包含的任务。</p> 大多数的Java项目都跟基础情况很相似:你需要编译你的Java源文件,执行单元测试,并且创建一个包含你的类的JAR包。如果你不需要为每个项目编写这些代码那将很好。幸运的是,你确实不需要去做。Gradle通过插件解决了这个问题。插件是Gradle的扩展,它用某种方式配置了你的项目,通常是添加一些预先配置好的任务去做一些有用的事情。Gradle包含了很多插件,你也可以很方便的编写你自己的插件并与别人共享之。一个这方面的插件就是Java插件。该插件给你项目增加了一些任务,这些任务可以编译你源代码、执行单元测试,并能打包JAR文件。 <p> Java插件基于约定配置的。这意味着该插件对项目很多方面定义了默认值,如,Java源文件的存放位置。如果你在项目里遵循约定,你一般不需要在你构建脚本里做什么事情。如果你在某些情况下不想遵循约定,Gradle也允许你个性化你的项目。事实上,因为是通过插件的方式来支持Java项目,如果你不想要,你甚至都可以完全不用插件来构建你的Java项目。</p> 我们在随后的章节里,在许多样例中深入的覆盖了Java插件、依赖管理和多项目构建等方面。在本章,我们打算给你一个如何使用Java插件构建Java项目的初步认识。</div>

阅读全文 »

《Gradle user guide》原创翻译 — 第六章 构建脚本基础

发表于 2013-09-21

译者注:从第六章开始翻译,为了个人学习需要,先省略了前面已经了解和不太相关部分。见谅。

6.1 项目和任务

Gradle里的一切都基于两个基本概念:项目和任务。(projects and tasks)。

每个Gradle构建都是由一个或多个项目组成的。项目代表你的软件中可构建的一些组件。具体的含义取决于你实际构建的东西。例如,项目可能代表一个JAR或者一个web工程。它也可能代表一个由其他项目生成的jar包组成的ZIP压缩包。项目不必代表准备构建的东西,它应该代表准备完成的事情,如,把你的应用发布到生成环境中。如果你仍感觉有些模糊也不用担心。Gradle对约定式构建的支持,给出了对项目更明确的定义。

每个项目由一个或多个任务组成。任务代表一些原子化的构建过程中执行的工作。如,编译一些类,创建一个JAR包,生成javadoc,或是发布一些归档到库中。

现在,我们将会关注在一个项目中定义一些简单的任务。在后面的章节,我们将会学习处理多项目以及更多的关于项目和任务的知识。

6.2 Hello world

你通过使用gradle命令来执行Gradle构建。gradle命令在当前路径下查找build.gradle配置文件。我们称这个build.gradle文件为构建脚本,或像我们随后看到的那样,严格的称其为构建配置脚本。构建脚本定义了项目和它的任务。

尝试创建名为build.gradle的构建脚本。
例子6.1 第一个构建脚本

build.gradle

task hello {
    doLast {
        println 'Hello world!'
    }
}}

在命令行中,进入包含脚本的目录然后通过gradle -q hello命令执行构建脚本。

例子6.2 执行构建脚本

gradle -q hello的输出</p> <blockquote> <p> > gradle -q hello
Hello world!
 </p> </blockquote> <table cellpadding="0" cellspacing="0"> <tbody> <tr> <td> -q选项做了什么?
用户手册中的大多数例子都是用-q选项执行的。这会屏蔽Gradle’s 日志信息,因此只会显示任务的输出信息。这会使用户手册中的例子的输出简洁一些。如果你不想可以不使用该选项。参见第18章,记录更详细的日志,影响Gradle输出的命令行选项。</td> </tr> </tbody> </table> 这里发生了什么?构建脚本定义了一个单独的称作hello的任务,并且给其增加了一个操作。当你执行gradle hello命令的时候,Gradle执行了hello任务,该任务依次执行你提供的操作。操作是等待执行的包含一些Groovy代码的闭包。

如果你认为这看起来和Ant的目标相似,那么你答对了。Gradle的任务就等于Ant中的目标(target)。不过,如你将要看到的那样,它强大的多。我们使用了与Ant不用的术语,是因为我们觉得任务比目标更贴切。不过,这里术语的使用与Ant产生了冲突,在Ant称命令为任务,如javac或copy。所以,当我们说任务的时候,我们都是指Gradle里的任务,等价于Ant里的目标。如果我们讨论Ant里的任务(Ant命令),我们会说ant 任务。

译者注:接下来会直接翻译第七章的内容,因为和译者直接相关。是关于构建Java工程的。</div>

阅读全文 »

Mac os下修改path环境变量

发表于 2013-09-20

不是什么高级的方法,只是我才刚会而已。记录一下。

修改:/etc/paths文件,跟windows一样增加你想要配置到path下的目录即可。

vim /etc/paths
阅读全文 »

自定义实现log4j的appender

发表于 2013-09-17

log4j,应用最广泛的日志框架。其作者后来推出logback,也是好选择。不多说废话。

log4j组件介绍
Log4j主要有三个组件: Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
Appender:负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。 Layout:负责日志信息的格式化。

log4j默认提供了很多Appender,如org.apache.log4j.ConsoleAppender,FileAppender等。不过,如果有特殊的需求,就需要自定义实现,比如把日志发送到Flume中。我们的需求正是如此。

自定义一个Appender很简单,只需继承AppenderSkeleton类,并实现几个方法即可。

@Override
     protected void append(LoggingEvent event) {
         System.out.println("OneCoder: " + event.getMessage());
     }

     @Override
     public void close() {
           // TODO Auto-generated method stub
     }

     @Override
     public boolean requiresLayout() {
           // TODO Auto-generated method stub
           return false ;
     }

上述代码的效果就是将原信息再开头加上”OneCoder”。我们想要发送到Flume里,也只需在该方法里添加Flume客户端的相关实现即可。这样你的系统日志就灵活多了。

当然,想要生效你需要修改log4j的配置文件,将appender改为你自己实现的appender即可。

阅读全文 »

计数排序Java实现

发表于 2013-09-12

计数排序——线性排序算法《算法导论》8.2

package com.coderli.algorithm.arrayandsort;

/**
 * 《算法导论》8.2 计数排序 线性排序算法<br>
 * 
 * <pre>
 * 计数排序假设<b>n个输入元素的每一个都是介于0到k之间的整数。</b>
 * k为某个整数,k = O(n)时。技术排序的运行事件为&Theta;(n)
 * 
 * 
 * @author OneCoder
 * @date 2013年9月11日 下午8:15:00
 * @website http://www.coderli.com
 */
public class CountSort {

	private static int[] sortArray = new int[] { 2, 5, 3, 0, 2, 3, 0, 3, 4, 1};
	private static int k = 6;

	public static void main(String[] args) {
		int[] countArray = new int[k];
		int[] outArray = new int[sortArray.length];
		// 给元数组中的数字计数
		for (int i = 0; i < sortArray.length; i++) {
			countArray[sortArray[i]] = countArray[sortArray[i]] + 1;
		}
		// 计算元素位置
		for (int j = 1; j < k; j++) {
			countArray[j] = countArray[j] + countArray[j - 1];
		}
		// 排序到输出数组
		for (int h = sortArray.length - 1; h >= 0; h--) {
			outArray[countArray[sortArray[h]] - 1] = sortArray[h];
			countArray[sortArray[h]] = countArray[sortArray[h]] - 1;
		}
		// 打印结果
		for (int n : outArray) {
			System.out.print(n + &quot; &quot;);
		}
	}
}

阅读全文 »

CentOS下 PostgreSQL部署记录

发表于 2013-08-20

MySQL License收费的问题越来越现实了。PostgreSQL成了最好的替代方案。

部署环境:CentOS6.3 x64。PostgreSQL版本:9.2.4-1。

CentOS的Develop包模式行可能已经带了PostgreSQL数据库,不过版本较老,这里还是要全新部署一个。官网提供了很多的部署方式,这里笔者选择的是命令行交互的离线安装包的方式,因为可以脱离网络和操作系统UI进行安装,比较贴近生产环境。

离线包下载地址:

  • http://community.openscg.com/se/postgresql/packages.jsp

下载好对应操作系统的包,赋予执行权限,执行即可完成安装。安装期间会交互的让你设置一些默认的存放目录,如果没有特殊要求,默认回车即可。

安装很快即可完成。

启动数据库

不能使用root用户启动,需要使用安装时新创建的用户,默认为postgres。

bin>postgres -D data

-D 为指定配置文件和数据存放目录。该目录须存在且包含postgres.conf配置文件。按照上面的方式安装后,只要指定为安装目录下的data文件夹即可。

如果不存在,则需要初始化该目录。

>initdb -D 目录

如果需要远程连接访问该数据库,需要修改pg_hba.conf文件,给指定的主机和ip开发访问权限。其实影响访问的还有postgresql.conf中的配置,不过默认是开放了权限的。

启动后可通过

>psql

客户端连接到数据库,查看数据库信息。具体命令可通过help查看。

阅读全文 »

Mac OS下 Redis2.6.14部署记录

发表于 2013-08-17

部署一个Redis作为缓存进行验证,记录部署过程。

官网:

  • http://redis.io/

目前最近稳定版为2.6.14。解压,进入目录。按照README文件的指引进行编译和验证。

在解压后的根目录执行

$>make

执行后,可以通过

$>make test

进行验证,基本看到的就是一堆OK。

编译完成,启动Redis服务。进入src目录。

$>cd src
$>./redis-server

至此,redis服务就启动好了,如果你想把redis相关的命令安装到/usr/local/bin下,可以执行

$>make install

启动后,可以通过客户端命令验证服务是否正常运行。

至此,一个redis服务就部署完成了,如果想通过Java访问可以下载Jedis包,API非常简单。

阅读全文 »
1 … 22 23 24 … 36
LiHongZhe

LiHongZhe

onecoder's blog.

352 日志
8 分类
RSS
Creative Commons
Links
  • 酷壳
  • 煮酒品茶
  • 小弟子的网络之路
  • 图表秀-在线图表制作
© 2012 - 2022 LiHongZhe
由 Jekyll 强力驱动
主题 - NexT.Muse
本站访客数 人次 本站总访问量 次