`
yinxvxv
  • 浏览: 50885 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java调用脚本语言笔记(jython,jruby,groovy)

阅读更多

有两种方法
1.java se 6以后实现了jsr 223规范

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"
scriptEngine.eval(code);//执行一段脚本,code是js代码

 很方便调用脚本
2.可以使用脚本语方本身提供的与java的集成手段

 

与jython集成
使用jsr223:
前提下载jython的包,已实现jsr223
(建议在官网上下载,在安装目录下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 这里也有,但是这个包里没有jsr223的实现,看包下存不存在org.python.jsr223)

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"
scriptEngine.eval(code);

 

使用PythonInterpreter,可以调用exec(String code)方法:

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec(code);

 

访问数据库
使用jdbc:

from oracle.jdbc.driver import OracleDriver
from java.sql import DriverManager

username = 'hr'
password = '123456'
url = 'jdbc:oracle:thin:@localhost:1521:XE'
driver = OracleDriver()
DriverManager.registerDriver(driver)
conn = DriverManager.getConnection(url, username, password)
stmt = conn.createStatement()
sql = "select salary from EMPLOYEES t where t.salary<2300"
rs = stmt.executeQuery(sql)
while (rs.next()):
 print rs.getInt('salary')
rs.close()
stmt.close()

 结果:
2200
2100
2200

 

使用zxJDBC :

from com.ziclix.python.sql import zxJDBC

url = 'jdbc:oracle:thin:@localhost:1521:XE'
username = 'hr'
password = '123456'
driverName = 'oracle.jdbc.driver.OracleDriver'
mysqlConn = zxJDBC.connect(url,username, password,driverName)
cursor = mysqlConn.cursor()     
cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");
#print cursor.fetchone()
list = cursor.fetchall()
for record in list:
    print "name:"+record[0]
#print cursor.description[0]
#print cursor.description[1]

 结果:
name:麦克
name:Olson
name:Philtanker

 

从数据库中查出的中文内容正常的。
而在代码里面的中文全部是乱码或抛异常,未解决。

 

与jruby集成
使用jsr223:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"
scriptEngine.eval(code);

 访问数据库

require 'java'

module JavaLang
  include_package "java.lang"
end

module JavaSql
  include_package 'java.sql'
end

begin
 username = 'hr'
 password = '123456'
 url = 'jdbc:oracle:thin:@localhost:1521:XE'
 driverName = 'oracle.jdbc.driver.OracleDriver'
 JavaLang::Class.forName(driverName).newInstance
 conn = JavaSql::DriverManager.getConnection(url, username, password)
 stmt = conn.createStatement
 sql = "select last_name from EMPLOYEES t where t.salary<2300"
 rs = stmt.executeQuery(sql)
 while (rs.next) do
  puts "名字:"+rs.getString("last_name")
 end
 rs.close
 stmt.close
 conn.close()
rescue JavaLang::ClassNotFoundException
 puts "ClassNotFoundException"
rescue JavaSql::SQLException
 puts "SQLException"
end

 结果:
名字:楹﹀厠
名字:Olson
名字:Philtanker

 

从数据库中查出的中文内容为乱码的。
而在代码里面的中文正常。

 

与groovy集成
使用jsr223:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"
scriptEngine.eval(code);

 使用GroovyShell:

GroovyShell shell = new GroovyShell();
Script script = shell.parse(code);
Object result = script.run();

 访问数据库

import groovy.sql.Sql

def username = 'hr'
def password = '123456'
def url = 'jdbc:oracle:thin:@localhost:1521:XE'
def driverName = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance(url, username, password, driverName)

sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {
 println "名字:${it.last_name}"
}

 结果:
名字:麦克
名字:Olson
名字:Philtanker

 

在使用groovy过程中碰到了一个异常
Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call
这个异常解决花了很长时间
是因为在原来项目中存在json-lib-2.1.jar(有可能名称为json-lib-2.1-jdk15.jar),这个包是用来处理json的,与groovy1.7.5存在冲突,更新为json-lib-2.3.jar即可
(json-lib里有一些groovy运行时处理的内容)

 

2
0
分享到:
评论
1 楼 song_27149 2017-11-03  
groovy异常说明解决了我目前的问题,十分感谢!

相关推荐

    请放弃 Jruby和Jython 而选择 Groovy

    对于Jruby、Jython和Groovy三种动态语言,长期以来很多人犹豫于如何选择它们。本文提出一个非常有力的例证证明:如果你是一个基于Java虚拟机的开发者,那么请放弃Jruby和Jython。

    Java调用python的方法(jython)

    主要介绍了Java调用python的方法(jython),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java与Jython的相互调用

    java与Jython的相互调用,对初学者很有帮助

    jython-standalone-2.7.0.jar

    java调用python脚本所需jar包,最新的版本,亲测可用,希望对你有帮助。jython-standalone-2.7.0.jar,jython-standalone-2.7.0.jar,

    java中调用python的必备jar包

    Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它...

    JythonExample:从 Java 执行 Python 脚本的简单 Jython 示例

    Jython 示例 介绍 这是一个从 Java 执行 Python 脚本的简单示例。 也可以看看: 编译 mvn clean package 跑步 java -jar target/jython-example-1.0-SNAPSHOT.jar

    有关JAVA的译文 Clojure:“挑战”Java编程语言

    Clojure是一个JVM的动态函数式语言,最近发布了1.0版本,版本中Clojure提供了一个...Clojure语言是一个JVM(包括Groovy,Jython和JRuby等语言)的新语言,它提供了活力,简洁得代码,并且与Java具有良好的相互操作性。

    java中jython操作把python数据类型转成java类型

    java中jython操作把python数据类型转成java类型 例如list-&gt;List dict-&gt;Map set-&gt;Set 以及一些基本操作的包装整合

    Java实现的执行python脚本工具类示例【使用jython.jar】

    这里java中执行python脚本工具类,需要使用jython.jar java中执行python脚本工具类,学习的时候写着玩: import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java....

    jython2.5.4_与jython2.7.0包

    该资源包含jython2.5.4.jar和jython2.7.0.jar,jython的版本要与jdk的版本要对应,这样可以解决“Unsupported major.minor version 51.0”问题。其中,对于jdk1.6.x的版本,请使用jython2.5.4.jar jdk1.7.x的版本,...

    Java实现调用jython执行python文件的方法

    主要介绍了Java实现调用jython执行python文件的方法,结合实例形式分析了Java调用jython执行python文件的常见操作技巧及相关问题解决方法,需要的朋友可以参考下

    Jython - Python的Java语言实现

    Jython - Python的Java语言实现 jython_installer-2.5.2rc2.zip 注意,需要先安装JDK 1, 解压到某处 2, 进入该解压目录, 执行jython.bat

    Jython for Java Programmers.chm

    Jython for Java Programmers.chm Java程序员学习Jython的教程。

    Java与Python之间使用jython工具类实现数据交互

    今天小编就为大家分享一篇关于Java与Python之间使用jython工具类实现数据交互,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    启动WAS Server的Jython脚本

    启动IBM WAS集群上的所有服务器,使用Jython实现,调用方法wsadmin.sh -f StartAllServers.py

    jython介绍及使用

    自己总结了一下jython的特性。供大家共同学习。 Jython 是一种完整的语言,...其实,Jython 说简单一些,就是用 Java 语言实现的 Python 解释器,这种关系也就意味着你可以用 Python 语言编写程序而同时使用 Java 库。

    The Definitive Guide to Jython-Python for the Java Platform

    Jython is an open source implementation of the high-level, dynamic, object-oriented scripting language Python seamlessly integrated with the Java platform. The predecessor to Jython, JPython, is ...

    Jython示例

    java调用Python示例,详情请参考博文:http://blog.csdn.net/l1028386804/article/details/50915556

    jython-2.7.1b3.jar

    java调用python脚本所需的jar包,可以在eclipse中执行python脚本, jython-2.7.1b3.jar

Global site tag (gtag.js) - Google Analytics