java开源的其它
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java开源的其它相关的知识,希望对你有一定的参考价值。
Quartz 【Java开源 Job调度】
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 1.5.0。
Velocity 【Java开源 模板引擎】
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和php之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 【VeloEclipse :Velocity在Eclipse平台下的一个辅助开发插件】
Roller Weblogger 【Java开源 Blog博客】
这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得html编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。
XPlanner 【Java开源 项目管理】
XPlanner 一个基于Web的XP团队计划和跟踪工具。XP独特的开发概念如iteration、user stories等,XPlanner都提供了相对应的的管理工具,XPlanner支持XP开发流程,并解决利用XP思想来开发项目所碰到的问题。XPlanner特点包括:简单的模型规划,虚拟笔记卡(Virtual note cards),iterations、user stories与工作记录的追踪,未完成stories将自动迭代,工作时间追踪,生成团队效率,个人工时报表,SOAP界面支持。
JOnAS 【Java开源 J2EE服务器】
JOnAS是一个开放源代码的J2EE实现,在ObjectWeb协会中开发。整合了Tomcat或Jetty成为它的Web容器,以确保符合Servlet 2.3和JSP 1.2规范。JOnAS服务器依赖或实现以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。
FreeMarker 【Java开源 模板引擎】
FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。
【FreeMarker Eclipse Plugin与FreeMarker IDE:Eclipse平台下的辅助开发工具】
Lucene 【Java开源 全文检索】
Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自己需要自订其功能。
Beanshell 【Java开源 动态语言】
Beanshell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和javascript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控制台模式、小程序模式和远程线程服务器模式等四种模式下面运行;与在应用程序中一样,可以在小程序中(Applet)正常运行(无需编译器或者类装载器);非常精简的解释器jar文件大小为175k
Big Two 【Java开源 Java游戏】
采用Java开发的中国式纸牌升级游戏。源码下载
JBoss SSO Framework 【Java开源 身份认证管理】
JBoss SSO Framework是一个组件集能够很容易集成到现有的web应用中提供单一登录功能.该框架已经能够支持一些重要的SSO标准如SAML。整个系统包括以下组件:
1.联合服务器(Federation Server)– 一个联合服务器用于为放置在不同安全域(security domain)中的web应用程序安全地传播Federation Token。
2.Token编排框架(Token Marshalling Framework)– 这是一组灵活的/可插件的Java API用来marshal/unmarshal一个Federation Token。该系统默认提供一个SAML兼容的编排器(Marshaller) 。
3.身份管管理框架(Identity Management Framework)–这是一组灵活的/可插件的Java API用来连接中中央身份存储库(Identity Store)。该系统默认提供一个Provider来连接基于LDAP的身份存储库。
JawFlow 【Java开源 开源工作流】
JawFlow是一个部分遵循WfMC规范,采用JMX技术开发的工作流引擎。它能够解析XPDL,并能够用Java或BSF支持的脚本语言来自定义行为。
rails-asyncweb 【Java开源 Web服务器】
用于JRuby on Rails的一个快速Http服务器。
jBatchEngine 【Java开源 Job调度】
jBatchEngine是一个采用Java开发的批任务spooler。jBatchEngine与其它以时间为驱动的Job调度引擎不同之处在于它是以事件以驱动,可用于启动任何批处理程序。jBatchEngine可以安装成一个Windows Service或一个Unix Daemon。
Gant 【Java开源 项目构建】
Gant是一个基于Ant的构建工具,它采用Groovy脚本代替XML来编写构建逻辑。 Gant完全依赖于Ant task来做真正的事情,所以你如果用Ant实现构建,但不喜欢用XML构建文件,Gant是一个不错的选择。
Jaxmao 【Java开源 Web服务器】
Tomcat是开源的JSP/Servlet服务器。多年的开发使Tomcat已越来越完善,被越来越多的网站采用。Jaxmao(中文版Tomcat)项目的任务是为Tomcat提供一个友好的中文界面,推广Tomcat在中文JSP/Serlet 开发者中的使用。
Metanotion BlockFile 【Java开源 DBMS数据库】
BlockFile一个100%纯Java,轻量级,单个文件嵌入式数据库。它的功能介于SQLite与BerkeleyDB之间。专门为PDA和Mobile应用程序而开发。
JRuleEngine 【Java开源 规则引擎】
JRuleEngine基于JSR94规范的java规则引擎。
JBasic 【Java开源 动态语言】
JBasic是一个完全采用Java开发的BASIC语言解释器。JBasic可运行在大部分Unix系统(包括Mac OS X),Windows command shell,或VMS DCL command line。
jSoapServer 【Java开源 Web Service】
jSoapServer这个Java类包可以集成到Java应用程序中为外部程序提供一个SOAP接口。jSoapServer是一个独立的SOAP服务器,因此不需要让Java程序运行在像Tomcat这样的容器中。
Artistic Style 【Java开源 代码优化】
Artistic Style是一个C,C++,C#和Java源代码缩排/格式化/美化工具。
JLoom 【Java开源 模板引擎】
JLoom是一个采用类似于JSP语法的模板引擎。参数可以是任何Java类型,甚至是泛型(generic)。JLoom还提供一个Eclipse插件来辅助开发。
Liquid look&feel 【Java开源 Swing外观】
基于Mosfet Liquid KDE 3.x主题的Swing外观。
MicroNova YUZU 【Java开源 JSP标签】
MicroNova YUZU开源基于EL的JSP标签库。这是一个增强的JSTL(兼容JSP1.2与JSP 2.0)。
如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是是开始学习这些工具的好时机。就来介绍下程序员都知道的10款Java开源工具,你知道几个呢?
1. JIRA
Atlassian的JIRA是当前敏捷开发领域最重要的工具之一。它用于错误跟踪,问题跟踪和项目管理。如果你遵循敏捷开发方法,例如Sprint和Scrum,那么你必须了解JIRA。它允许您创建Spring循环并跟踪软件开发的进度。
JIRA 是目前比较流行的基于Java架构的管理系统,由于Atlassian公 司对很多开源项目实行免费提供缺陷跟踪服务,因此在开源领域,其认知度比其他的产品要高得多,而且易用性也好一些。
2. Git
Git是Java程序员的另一个必备工具,它是一个免费的开源分布式版本控制系统,旨在快速高效地处理从很小到非常大的项目版本管理。Git易于学习,占用空间小,具有超强的性能。最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是发现已经在很多其他自由软件项目中也使用了 Git。
3. Jenkins
Jenkins是一个用Java编写的开源自动化服务器。它有助于自动化软件开发,例如编译项目,运行单元测试,集成测试,生成文档以及在本地和远程存储库上载工件。
4. Selenium
Selenium是Web应用程序最好的软件测试框架之一。它提供了一种用于创作测试的回放工具,而无需学习测试脚本语言。Java开发人员可以使用Selenium来测试他们的HTML和JSP文件。
5. Groovy
Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。你可以使用它编写构建脚本,测试脚本,甚至可以使用像Gradle和Spock这样的流行框架。
6、Spock
Spock 是适合 Java 和 Groovy 应用程序的一个测试框架。由于其JUnit运行程序,Spock与大多数IDE,构建工具和持续集成服务器兼容。如果你想提高你的单元测试技能,那么多花点时间在学习Spock上总是没错的。
7. Maven
如果你是一位经验丰富的Java开发人员,那么你一定非常了解Maven了,Apache Maven是一个构建和项目管理工具,基于项目对象模型(POM)的概念,Maven可用于管理项目的生成、报告和文档记录。
Maven的另一个有用特性是依赖关系管理,由于我们在Java项目中使用了大量第三方库,因此手动管理每个JAR及其依赖项可能非常麻烦,Maven通过自动为你下载正确的JAR来帮助你解决问题。
8. Gradle
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。为什么选择Gradle在Ant或Maven?因为它结合了其他构建工具的最佳特性,例如它具有Ant的灵活性和控制,Ivy的依赖管理,Maven的配置和插件的约定,以及可以在Ant上使用Groovy DSL。这使它成为Java项目的最佳构建工具。
9. Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。
10. Linux
初学Linux最好从Linux命令行基础知识开始,Linux是一种自由和开放源码的类Unix操作系统,在你的职业生涯中起到重要的作用,每一个Java开发者都应该学Linux。如果以上工具还有你没学会的,那就不要再错过了赶紧学起来。
Java中ASM框架详解
什么是asm呢?asm是assembly的缩写,是汇编的称号,对于java而言,asm就是字节码级别的编程。
而这里说到的asm是指objectweb asm,一种.class的代码生成器的开源项目.
ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类,
或者在类被java虚拟机装入内存之前,动态修改类。
现在挺多流行的框架都使用到了asm.所以从aop追溯来到了这。
1.什么是ObjectWeb ASM
ObjectWeb ASM是轻量级的Java字节码处理框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。
ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,
是BCEL 的7倍,SERP的11倍以上。
在我看来,ObjectWeb ASM具有如下几个非常诱人的特点
* 小巧、高效
* 源代码实现非常简洁而又优雅,简直就是Gof的《设计模式》非常棒的注解
* 字节码级的控制,能够更高效地实现字节码的控制
ObjectWeb ASM有2组接口:
* 基于事件驱动的接口,类似于xml的SAX接口,visitor模式,在访问到类定义某个部分的时候进行回调,实现上比tree接口高效,占用内存更小
* 基于tree的接口,类似于xml的DOM接口,将类定义解析成tree
这里我们将使用ObjectWeb ASM的事件驱动接口
2. 目标
我们将对已有的字节码进行增强,收集进入方法和退出方法的信息,这里主要解决Method Monitor的字节码增强部分,
不对收集后的数据处理做更深入地研究,出于演示的目的,我们定义了如下的收集方法的访问信息处理,
在实际应用中,我们可能会使用更好的格式收集更多的数据、使用异步处理提高性能、使用批量处理提高处理能力、使用友好的UI显示信息等等,
此处不对这部分进行探讨
1. package blackstar.methodmonitor.instrutment.monitor;
2. public class MonitorUtil
3. {
4. public final static String CLASS_NAME = MonitorUtil.class.getName()
5. .replaceAll("\\.", "/");
6. public final static String ENTRY_METHOD = "entryMethod";
7. public final static String EXIT_METHOD = "exitMethod";
8. public final static String METHOD = "(Ljava/lang/String;Ljava/lang/String;)V";
9.
10. public static void entryMethod(String className, String methodName)
11. {
12. System.out.println("entry : " + className + "." + methodName);
13. }
14.
15. public static void exitMethod(String className, String methodName)
16. {
17. System.out.println("exit : " + className + "." + methodName);
18. }
19. }
3. 从字节码开始
实际上,对于被监控制的代码,我们所需要实现的功能如下,红色部分的代码是我们需要在动态期插到字节码中间的
public xxx method(…)
{
try
{
methodEntry(…)
methodCode
}
finally
{
methodExit(…)
}
}
这个问题看起来简单,实际则没有那么容易,因为在JVM的字节码设计中,字节码并不直接支持finally语句,而是使用try…catch来模拟的,我们先来看一个例子
Java代码
1. package blackstar.methodmonitor.instrutment.test;
2.
3. public class Test
4. {
5. public void sayHello() throws Exception
6. {
7. try
8. {
9. System.out.println("hi");
10. } catch (Exception e)
11. {
12. System.out.println("exception");
13. return;
14. } finally
15. {
16. System.out.println("finally");
17. }
18. }
19. }
我们看看字节码是如何处理finally语句的
首先看看异常表,异常是在JVM级别上直接支持的,下面异常表的意思是,在执行0-8语句的时候,如果有异常java.lang.Exception抛出,则进入第11语句,
在执行0-20语句的时候,有任何异常抛出,都进入29语句。实际上JVM是这样实现finally语句的:
* 在任何return语句之前,都会增加finally语句中的字节码
* 定义一个捕获所有异常的语句,增加finally语句中的字节码,如果finally中没有return语句,则会将异常再次抛出去(处理方法以抛出异常的方式结束)
Exceptions:
[0-8): 11 - java.lang.Exception
[0-20): 29
我们再看看字节码具体是如何做的
0 getstatic java.lang.System.out
3 ldc "hi" (java.lang.String)
5 invokevirtual println
8 goto 40
// System.out.println("hi");,执行完之后执行返回(goto 40)
11 astore_1
12 getstatic java.lang.System.out
15 ldc "exception" (java.lang.String)
17 invokevirtual println
// System.out.println("exception");
20 getstatic java.lang.System.out
23 ldc "finally" (java.lang.String)
25 invokevirtual println
// return语句之前插入finally部分字节码
// System.out.println("finally");
28 return
29 astore_2
30 getstatic java.lang.System.out
33 ldc "finally" (java.lang.String)
35 invokevirtual println
38 aload_2
39 athrow
//当在执行0-29语句中,如果有异常抛出,则执行这段finally语句
//此处的astore_2(将栈顶值——即exception的地址——设给第2个local变量)和aload_2(将第2个local变量的值入栈)这两个字节码实际是不必要的,
//但需要注意的是,如果这2段代码去掉的话,要考虑增大操作栈(max stack)以容纳这个exception地址
//System.out.println("finally");
40 getstatic java.lang.System.out
43 ldc "finally" (java.lang.String)
45 invokevirtual println
// return语句之前插入finally部分字节码
// System.out.println("finally");
48 return
实际上,我们需要做的就是
* 在方法进入时插入方法进入代码(需要注意,对于构造函数不允许做这种处理,构造函数第一步必须调用父类的构造函数。
* 在每个return操作(包括return、ireturn、freturn等)之前,插入方法退出代码
* 定义一个捕获所有异常的处理,在处理中,插入方法退出代码(即方法以抛异常的方式终止执行)
4. 实现
我们看看使用ObjectWeb ASM如何实现我们上面描述的功能
1)ObjectWeb ASM的字节码修改
1. ClassReader cr = new ClassReader(byteArray); //使用字节码构监一个reader
2. ClassWriter cw = new ClassWriter(cr, 0);//writer将基于已有的字节码进行修改
3. MonitorClassVisitor ca = new MonitorClassVisitor(cw);//修改处理回调类
4. cr.accept(ca, 0);
以上是关于java开源的其它的主要内容,如果未能解决你的问题,请参考以下文章