Maven实例入门-随机数生成

看了很多个例子,发现这个最好,译文中会带有我的一些了理解,有问题欢迎指出。 0.Maven是什么? Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 可以看到,核心就是项目管理和自动构建了,从例子中将会体会更深。本例创建一个随机数生成程序。 1.从Maven模板创建项目 Maven的环境变量配置和java类似,直接添加系统变量MAVEN_HOME指向你下载的maven目录,然后将bin目录添加到path环境变量里。 在命令行下,进入到你想存储项目的位置,比如,我自己有个叫work的目录,那么我就cd到work目录,然后按下面的格式输入命令 这是告诉Maven从**maven-archetype-quickstart **创建一个java项目,如果你这个参数不填,那么会列出一个列表,让你选择你想创建什么类型,比如web项目啊,啥的。 友情提示:是不是太难记了..好吧,直接输入 根据向导来创建把。。 比如 这里的groupId就是包名,artifactId就是类名,以后具体的一些其他参数我希望有时间可以跟大家分享。 2.Maven目录结构 上面的命令第一次执行的时候会从apache网站下载maven的一些其他东西,所以务必保持联网。执行成功后,会生成一个这样的目录结构 这里main目录是我们的程序住代码目录。源代码会放在/src/main/java/包名 目录里,而单元测试代码会放在/src/test/java/包名 目录里。当然还有一个标准的pom.xml文件会生成。这个pom文件其实类似于Ant的build.xml文件,它包含了项目的信息,从目录结构到项目插件到项目依赖,都有了。。 3.用Eclipse写代码 maven已经生成了一个完整的工程了,为了能够导入到eclipse里来编辑代码,我们可以把这个项目转换成eclipse可用的。 首先命令行进入NumberGenerator目录,然后输入 然后就会生成Eclipse需要的所有项目文件里 图1.导入eclipse之后的效果 4.更新pom文件 默认的pom文件太简单了。通常我们需要添加编译插件来告诉Maven我们打算使用哪个版本的jdk来编译项目,有时候默认的版本太低了 我们把source和target改成了1.6. 然后更新JUnit到4.1.1 最终我们的pom文件如下 5.更新业务逻辑 TDD开发的理念告诉我们先写测试,我们打开AppTest.java文件。 然后修改App.java的代码 6.Maven打包 现在,我们要使用Maven来编译我们的项目,并且打包成一个jar文件,记得pom.xml文件吗?在这个文件里我们定义了打包的类型 在项目目录(也就是NumberGenerator目录)的命令行下,输入 然后就会看到: 程序开始编译,并且执行了单元测试,然后在target目录下生成了jar包,最后,程序目录结构如下: 7.执行Demo 运行生成的jar文件,还在在NumberGenerator目录下,输入如下命令 后面的com.mkyong.App就是包名+类名,也就是类的全名了 8.Demo下载 Maven-NumberGenerator.zip  基本上一个完整的的示例就做完了,希望你有所收获,后续会更新一些Maven的的东西。欢迎支持。中秋快乐。   

Maven提示缺少tools.jar

记录一下。 这两天在熟悉Maven,长见识了.后续可能的话会写上一两篇,今天配置的时候提示tools.jar文件。于是使用everything搜了一下,本机的jdk目录还真没有,最后搜了一下,发现是安装jdk时候的问题,具体就是因为安装jdk的时候,后面被让继续安装jre,这个时候,我为了方便,将jre安装在了jdk的目录里,结果导致jre会覆盖到jdk的这两个文件。同时还会覆盖dt.jar这个包,于是,就没了。。这个问题略隐晦了..  重新安装了jdk,将jdk和jre分开目录,然后设置一下jdk的lib目录到classpath就可以了,问题解决。

[译]Java中的CountDownLatch和CyclicBarrier

本文译自官方文档,有细微改动,Java多线程的时候,看了好多文档,还是官方说的最清楚。结合自己的理解,译之。 CountDownLatch 字面意思就是倒计数闩,后面会讲到,这里的同步允许一个或多个线程等待,,知道其他线程进行的一系列操作完成。而CountDownLatch通过一个参数count(数目)来构造,而await()则阻塞当前线程,直到countDown()将count减为了0,然后,所有的阻塞线程被释放,也就是那些调用了await方法的线程立即返回,注意,这是一次性的,也就是说count不能被自动重置,如果你想这么做,CyclicBarrier是可以的。 CountDownLatch用处很多,当用count=1来构造的时候,这就相当于一个开关,所有调用了await方法的线程都在等待,直到有一个线程调用了countDown(),CountDownLatch通过count=N构造的话,就可以使一个线程等待其他N个线程完成操作,或者一个操作被做N次。 简单的demo: 一组worker(工人)线程使用两个CountDownLatch 第一个是开始信号,用来阻止工人提前操作,直到(driver)传送带准备好了才允许开始 第二个是完成信号,他使传送带等待直到所有的worker都完成 另一个典型的例子就是把问题分成N部分,通过线程执行每一部分,具体的话是将线程入队到一个Executor对象里。然后调用execute方法。当执行完毕一部分,就并给latch 减去1,当减到0的时候调用await的方法就可以继续运行了,当需要重复计数的话,用CyclicBarrier代替  CyclicBarrier 字面意思回环栅栏。这里的同步是允许一系列的线程互相等待直到大家都来到一个barrier前面,当程序中有互相等待的情况的时候,非常有用,叫做回环是因为当所有等待线程都被释放以后,cyclicBarrier可以被重用 同时,CyclicBarrier支持一个可选的Runnable参数,当所有的线程都来到barrier前面的时候,程序开始执行runable线程动作,当需要更新所有线程共享的某个状态的时候,该动作非常有用。例子是一个并行分解的例子 这里每一个worker线程处理矩阵的一行,然后在barrier前面等待,直到所有的行都处理完成,当所有的都完成以后,这里 的Runnable参数执行来合并这些行,一旦有了正确的结果waitUntilDown()就返回true,然后所有的线程终止。 如果barrier执行的这个动作没有对那些等待的线程做出回应,以使的这些线程做一些别的操作,我们可以这么写,将 改为 如果一个线程由于中断,失败或者超时过早的离开了barrier,那么所有的线程都会通过BrokenBarrierException引发异常。

Unix sed实用教程系列目录

本系列文章已经译完了,译自awk-sed@theunixschool,收获颇丰,作者没有将明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感谢原作者的分享.有任何问题欢迎留言讨论. Unix sed实用教程开篇 [译]Unix sed实用教程第一篇–向文件中增加一行 [译]Unix sed实用教程第二篇–替换文件内容 [译]Unix sed实用教程第三篇–读写文件 [译]Unix sed实用教程第四篇–选择性打印 [译]Unix sed实用教程第五篇–替换文件内容续 [译]Unix sed实用教程第六篇–删除文件内容 [译]Unix sed实用教程第七篇–输出文件内容(10 Demo) [译]Unix sed实用教程第八篇–CSV文件操作

[译]Unix sed实用教程第八篇–CSV文件操作

本文作为sed使用教程的最后一篇,将比较全面的讲解如何操作csv文件,csv文件通过逗号分隔 示例文件如下: 1.删除第一列s开启替换模式,当^符号在中括号里的时候,就是非的意思,也就是说[^,]匹配了所有不是逗号的一个字符,然后后面的星号表示0个或多个,然后是一个逗号,也就是匹配"xxxx,“替换为空 2.删除除过最后一列的其他所有sed先匹配任意多个字符,然后匹配最后一个“,”这就直接把前面的都匹配完了。替换为空即可。 3.输出第一列好理解把,先匹配第一列之后的逗号,然后是多个字符,然后替换为空 4.删除第二列先匹配第一列之后的逗号,然后匹配一个或多个非逗号字符,这样就匹配了第二列的内容,然后再匹配一个逗号,我简化一下,比如该列是1,2,3,4,那么这一个匹配就是”,2,",替换成一个逗号,就是1,3,4了 5.输出第二列我们可以分析前两个斜线之间的内容 两个右斜线转移了括号,所以括号不是简单的符号,而是正则里的组的意义,圆括号的作用是对字符进行分组,并保存匹配的文本。这里先匹配非逗号的多个字符,然后一个逗号,然后再匹配第二列,并且第二列的匹配用括号括起来,然后匹配其他列,然后里面用\1来引用这个括号的内容,如果前面有两个括号,就可以使用\1或\2这样,分别表示第一个括号或第二个括号的匹配 6.输出最后一列是一位数字的行.*匹配了前面的所有字符,然后,匹配了最后一个逗号,sed的贪婪原则。。然后[0-9]匹配一个数字$表示行尾.ok 7.给每一行自动添加行号这个和cat -n file的效果是一样的。awk也可以很简单的做,这里使用一个=命令会在每一行之前添加一个行号,也就是是,如果执行 文件会是: 然后我们通过管道再执行 N表示读入并合并下一行,然后将两行之间的换行符替换为空即可了 8.如果第一列是Ubuntu,就把最后一列替换成99中间的 匹配“Ubuntu,任意个字符,任意个字符”,也就是将行分成几组,将本行替换成第一组的内容第一组的内容,第二组的内容,但最后的一列被替换成99,就这样。 9.如果第一列是RedHat就删除第二列也好理解嘛。将要保留的用括号分组,然后用\1和\2分别引用第一组和第二组,然后中间的匹配就被删除了 10.在末尾插入一列正则首先匹配了整行字符,然后使用&来引用该匹配,然后添加了一个逗号和一个A 11.在头部添加一列 很简单不是么… 比预计的要快,两天翻译完了.体会到了理解原理对学习sed的好处,希望对想学的人有帮助.           

[译]Unix sed实用教程第七篇–输出文件内容(10 Demo)

之前已经学习过选择性打印输出了,本文将通过10个例子全面讲解文件输出的一些方法,主打p命令 首先看一下将使用的示例文件 1.打印文件首行之前讲过了,-n取消默认的全部打印,p表示print,1就是行号了 2.输出最后一行3.输出不匹配X的那些行也好理解,!表示非,就是说包含X匹配的不打印输出 4.输出包含u/x的那些行正则是强大的,这样就匹配了u/x 5.输出以x/X结尾的那些行这里$符号不再是匹配文件尾部,而是行尾,这是正则的规则 6.输出以A/L开头的行前面也说过,^匹配了行首,A表示A匹配,然而|则是或者的意思,为什么要加\转义,是为了避免被解析成pipe管道,后面的就不解释了 7.隔行打印n命令是输出当前行,然后读入下一行到pattern space的意思,这句命令是这么执行的,首先读入一行,然后通过n命令输出,然后通过n命令再读一行,然后把这行删除,就出现了隔行输出的效果 8.如何两行输出,隔两行再输出n;n; 命令呢输出了前两行,然后读入第三行到pattern space,N命令则对如下一行并与第三行合并,然后d命令删除pattern space中的内容,于是三四行被清空,然后读入56行,继续重复。就这样。作者这里给出的例子不直观,我举个例子,我的文件内容是 执行上面的命令后,会输出 明白了吧 9.输出某个范围行内以X结果的那些行这里首先制定了从/Unix/匹配开始到文件尾部的这些行,然后呢,在这些之间的行,如果以X结果,就输出。 10.输出不包括开始和结尾的那些行这个命令就会只输出/Solaris/和/HPUX/之间的行,不包括他们两个。 这里要说一下//这个,当匹配了Solaris的时候就进入了花括号,因为这个里面没有提供任何匹配,所以就考虑最后一次匹配模式,也就是相当于是考虑Solaris这一行,他不被打印,当到了HPUX这一匹配,//又代表了HPUX匹配,这一行也不打印。 Demo完了,你懂了么。

[译]Unix sed实用教程第六篇–删除文件内容

其实,删除和替换是由一些相同的,不过,这里我们单独列出来,通过25个例子穿插讲解sed删除文件的一些方法,使用的示例文件如下: 1.删除第一行d就是删除,1就是指第1行,记得哦,这不会影响到源文件,一般,做删除的时候一般要加-i参数,前面说过了 2.删除指定行,这里删除第3行3.删除最后一行4.删除范围行,这里删除2-4行5.保留指定的行,这里保留2-4行!这个是对前面的2,4来操作,是非的意思,也就是不是2-4行的行,这样除去2-4行,其他的都删除了 6.删除第一行和最后一行分号隔开两个命令,你懂的,也可以删除第二行和第三行等等. ‘2d;3d’ 7.删除以指定字符开头的行这里就把以L开头的Linux这一行删除了 8.删除以指定字符结尾的行这里就删除了,可以看到AIX没有删除,unix区分大小写你懂的 9.忽略大小写,都删除[xX]匹配x或X,所以就成功了嘛 10.删除文件中的空行^匹配开头,$匹配结果,中间啥都没有,这样就匹配了空行,但是注意哦,如果某一行全是空格,这个命令是不会删除这一行的。 11.删除空行或是仅仅包含空格的行如果你看我前面的文章,这个就不用我说了吧,0个或多个空格就是匹配了所有的空行了 12.删除完全是大写字母的行[A-Z]就匹配了26个大写字母的任意一个 13.删除包含Unix匹配的行14.删除不包含Unix的行15.删除包含Unix或Linux匹配的行这里要说的是|,这个本来是表示or,或的意思,但是在终端下,为了防止被认为是管道,所以要用\来转义 16.删除从第一行到满足匹配的行可以通过行号到模式,模式到行号等等组合来匹配 17.删除从Linux匹配到末尾的行18.如果最后一行匹配AIX就删除,否则就不删除$匹配了最后一行,也可以是行号,比如1,后面的大括号里就是条件和处理方式了,这样就在sed里实现了if条件了,再看一遍这个例子,熟悉一下这个规则 19.所处最后一行如果满足两个匹配20.如果1-4行满足Solaris匹配就删除21.删除包含Unix匹配的行,同时删除下一行N命令将下一行读入pattern space,什么。你忘了,看开篇去,这个命令就删除了两行 22.删除包含Unix的下一行作者这里没有说清楚,我讲一下,N读入了下一行,然后这时候pattern space里就相当于两行并作了一行,中间有一个换行符,所以pattern space里现在就是: 然后通过s命令匹配了\nLinux,并且替换为空,就ok了哦。 23.删除包含Linux模式的行,也包含上一行少年,不要怕,我们一步步来 首先,要知道,为了删除某一匹配的前一行,我们需要将文件的每一行放入到hold space里,一旦发现匹配,我们就开始删除连个缓冲区的内容,其中pattern space存储了当前行,hold space 存储了前一行 而x;p;这是啥呢,这两个命令是对每一行都会执行的,x表示exchange,即是交换hold space 和pattern space中的内容,p则是print,打印pattern space中的内容,因此,每次当前行被存入hold space,然后打印出了前一行的内容 当/Linux/匹配之后,我们使用s/.//来清空当前行,也就是pattern space为空了,当前行相当于被删了,然后使用x和hold space来交换,这样,就导致hold space为空了,然后使用d来删除pattern space的内容(此时pattern space里是交换过来的前一行的内容),因此,匹配Linnx的当前行和前一行都被删除了, 然后呢${x;p;}表示如果最后一行还在hold space里,就把他换出来,打印出来。 而后面的管道之后的命令呢,是吧第一部分sed命令之后产生的空行给删掉。 再理解一下 24.仅删除匹配Linux的前一行,不删除当前行和23类似,当匹配到Linux的时候,hold space 存储了前一行的内容,所以我们交换一下他们,然后前一行就进入了pattern space,然后一个d,这样就把前一行删掉了。别急,还没完,这样,当前行就被留在hold space了。就无法被输出了 1h;1!{x;p;} 1h是说,如果将第1行移动到hold space,也就是1h只对第一行操作,而后面的1!{x;p;}是说对于其他的行执行x;p;命令, 25.删除匹配模式的前后两行有了前面两个例子,自己试试理解一下,有问题留言讨论吧。

[译]Unix sed实用教程第五篇–替换文件内容续

前面已经学习过替换文件内容了,本文我们学习一些更频繁使用的搜索替换操作. 示例文件使用: 1.替换每行开始的两个字母,这里用XX来替换s代表substitute,前面说过了,^用来匹配行开头,.表示任意一个字符,两个..就是你懂的, 其实,不要^符号也是可以的,因为默认就是从开头开始匹配,如下也可以实现 2.删除每行开头的两个字符看到没有,后两个斜线之间没有内容,也就是用空字符来替换开头的两个字符,就实现了删除 3.要是想删除每行最后的两个字符呢再次强调,$在不同的情况下表示不同的意思,这里匹配行尾,有时候也匹配文件尾部 4.向每行末尾添加内容这里,先匹配行尾,然后把".Rs"添加到行尾 5.在每行开头添加空格还记得前面说过的么,sed默认不影响原始文件,要是想更新原始文件,请加-i参数 6.移除开始的空格^匹配行首,然后是一个空格,然后是*,表示一个或多个空格嘛,然后替换为空字符 7.移除行首和行尾的空格不要怕,从分号处分开,就是两条命令啦,一个做行首的,一个做行尾的,前面说过的,可以使用-e参数来分开 8.如何在一个字符串前后添加一些其他字符呢,可以用来字符串转义前两个斜线匹配了所有字符,也就是本行,然后后面两个斜线是替换的内容,注意里面的&符号,之前也说过的,表示匹配到的字符,也就是本行了。所有就这样啦 9.移除行首和行尾的一个字符(多个你也会的啦)分开看看,你可以的 10.删除第一个数字之前的所有字符这条命令略复杂,请先回头看一下我们的示例文件,然后我们开始分析这个表达式,地一个^表示匹配行首,然后[^0-9]* 是一个典型的正则,匹配非数字的多个字符,简单说一下[0-9]表示匹配0,1,2,3,4,5,6,7,8,9任意一个字符,前面加个一个^,表示非,也就是不匹配这些数字,然后最后是一个*,表示匹配非数字的连续多个字符,有机会的话我会推荐一个正则系列,或者自己写一篇文章。这里就先这样理解吧。 那猜猜这个是干嘛的 是的,你猜对了,删除开头的所有非字母字符。 11.删除行尾的数字看看前面的你就知道了 12.通过分隔符得到文件最后一列可能你你预想的不一样,是不是,你可能认为会是第一列被删除,其他的列都在,不对的,sed是很贪心的,当我们指定'.*:‘时,他会一直向后查找,尽量匹配更多,所以,就匹配到最后一个列之前了 13.转换整行字符为小写\L是sed的一个命令,Lowercase嘛。\L之后的内容被毁转换,而&表示前面匹配道德内容,所以就实现了转换 14.转换大写\U你懂的,Uppercase

[译]Unix sed实用教程第四篇–选择性打印

本文,我们将会学习如何选择性的打印(其实,这里的打印是print,也就是输出到标准输出的意思),用到的示例文件是: 1.打印所有内容一对单引号,没有任何参数即可 2.如何打印包含Gmail的那一行.(grep也可以实现这个功能)在斜线里面,我们指定正则匹配模式,p的意思呢,就是print,打印的意思,也就是打印包含Gmail这一行,但是我们看到Gmail打印了两次,为什么,因为sed的默认行为是在解析完一行之后就把他输出出来,也就是对于Gmail这一行,先执行p解析,解析完成后再默认打印一次,就打印了两次,而其他的,没有命令解析,直接读入完成后输出即可。 如果得到期望的结果呢? -n参数会取消sed的默认打印行为,所以就ok了 3.删除包含Gmail的那一行。(grep -v也有同样的效果)d就是delete的意思,不多解释, 同样,要想删除某一指定的行 4.打印直到模式匹配,这里我们从头一直打印到Yahooq就是quit的意思,这条命令就是对于前面的行都没啥可解析的,执行默认的打印即可,一到碰到Yahoo这一行,打印完成,就停止,退出,因此,就是上面的了 打印某一指定范围行 到此,我们一直在学习基于一个条件取一行或多行,现在,我们来学习打印指定范围行 使用的示例文件如下: 5.打印前三行-n先取消默认打印,然后1,3指定行范围,p表示打印,你想一下我们前面的q命令,就知道下面这个命令效果是一样的 执行默认打印,到第三行的时候退出 6.通过模式指定范围,这里我打印从Yahoo到Live之间的行,包括本身不用多解释了 7.从指定模式到文件尾部,这里是从Redif到文件尾回忆一下$符号吧.少年 8.从开头到匹配模式相信你懂的… 对于数字不需要斜线包围,对于匹配需要斜线.就这样..   

[译]Unix sed实用教程第三篇–读写文件

本文将展示如何将文件内容读入到sed输出,同时包含如何将一个文件的部分内容写入到另一文件 一.文件读取 假定有两个文件,file1和file2,内容分别如下: sed有两个选项用来读写文件 看例子: 1.在file1的每一行读完之后读取file2的内容r file2读取file2的所有内容,因此r之前没有知道那个行号或匹配,因此有了上面的输出,记住,sed的工作机制,每次读file1的一行,然后执行命令 2.如何在读取了file1的第一行之后将file2读入r前面加个1就行了 3.当file1某行匹配了模式之后,读入file2sed逐行读入file1,然后判断该行是否匹配banana,如果匹配,就读入file2 4.当file1读取完成后读入file2,其实就是合并两个文件这里只是演示一下,其实cat file1 file2就可以完成合并 二.文件写入使用一个file1文件,内容如下: 1.将file1的2-4行写入到file22,4w就是写2-4行的意思,那-n呢?默认情况下sed会把读入的文件处理的结果输出到标准输出,也就是终端,而为了不使用默认输出,-n就派上用场了,执行该命令终端不会有任何输出 查看file2内容,发现已经写入成功了 2.从第三行开始全部写入file2就不多解释了 3.如果是用正则呢?该命令将逐行读入file1,然后判断该行是否匹配apple,如果匹配,则作为起始行,然后继续读入,判断是否匹配mango,如果是,则作为终止行,然后将中间的内容写入到file2