-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 營(yíng)銷推廣 > 專題列表 > 正文
動(dòng)態(tài)生成groovy腳本(groovy 腳本)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于動(dòng)態(tài)生成groovy腳本的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁(yè)版、PC客戶端和批量生成器
問友Ai官網(wǎng):https://ai.de1919.com。
本文目錄:
如何使用gradle構(gòu)建工具打包groovy腳本成jar文件
只需要編譯打包groovy腳本 所以只需要?jiǎng)?chuàng)建 src/main/groovy目錄結(jié)構(gòu)。例子:
gradle_groovy_archive項(xiàng)目 結(jié)構(gòu)是:
gradle_groovy_archive
創(chuàng)建helloWorld.groovy腳本,代碼如下:
package hello
println 'Gradle compile groovy'創(chuàng)建Gradle構(gòu)建文件:
apply plugin: 'groovy'
apply plugin: 'maven'
group = 'com.hello'
archiveBaseName = 'hello'
version = '0.1-SNAPSHOT'
defaultTasks 'clean', 'jar'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
dependencies {
//使用本地groovy環(huán)境
groovy localGroovy()
//groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
compile fileTree( dir: 'lib', include: ['*.jar'])
deployerJars 'org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-7'
}
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
}
}
uploadArchives {
repositories.mavenDeployer {
uniqueVersion = false
configuration = configurations.deployerJars
repository(id : repositoryId, url : repositoryUrl) {
authentication (userName : 'deployment', password : 'deployment')
proxy()
}
}
}創(chuàng)建構(gòu)建文件屬性文件:
//根據(jù)不同情況修改
repositoryId=ND
repositoryUrl=ND
systemProp.http.proxyHost=ND
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=ND
systemProp.http.proxyPassword=ND在命令行中 敲 gradle 運(yùn)行,會(huì)自動(dòng)運(yùn)行 defaultTasks,clean 和 jar,會(huì)把 所有g(shù)roovy下的腳本打成jar包。
在java中使用groovy怎么搞
1、靜態(tài)編譯,在java工程中直接寫groovy的文件,然后可以在groovy的文件中引用java工程的類,這種方式能夠有效的利用groovy自身的語言特性,例如閉包;
2、通過groovyShell類直接執(zhí)行腳本,例如:
package groovy_dsl.shell;import groovy.lang.Binding;
import groovy.lang.GroovyShell;
public class GroovyShellEx {
public static void main(String[] args) {
Binding bind = new Binding();
bind.setVariable("name", "iamzhongyong");
bind.setVariable("age", "25");
GroovyShell shell = new GroovyShell(bind);
Object obj = shell.evaluate("str = name+age;return str");
System.out.println(obj);
}
}
3、通過groovyScriptEngine執(zhí)行文件或者腳本,例如:
package groovy_dsl.script;import groovy.util.GroovyScriptEngine;
public class ScriptEngine {
public static void main(String[] args) throws Exception {
GroovyScriptEngine engine = new GroovyScriptEngine("");
Object obj = engine.run("src/main/java/groovy_dsl/script/script_test.groovy", "iamzhongyong");
System.out.println(obj);
}
}
4、通過GroovyClassLoader來執(zhí)行,例如:
package groovy_dsl.classloader;import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import java.io.File;
import java.io.IOException;
public class GroovyClassLoaderEx {
public static void main(String[] args) throws Exception, IOException {
GroovyClassLoader loader = new GroovyClassLoader();
for(int i=0;i<100;i++){
Class<?> clazz = loader.parseClass(new File("src/main/java/groovy_dsl/classloader/UserDO.groovy"));
GroovyObject clazzObj = (GroovyObject)clazz.newInstance();
clazzObj.invokeMethod("setName", "iamzhongyong");
clazzObj.invokeMethod("setSex", "Boy");
clazzObj.invokeMethod("setAge", "26");
System.out.println(clazzObj.invokeMethod("getAllInfo", null));
}
}
}
在java中使用groovy怎么搞
一種基于Java虛擬機(jī)的動(dòng)態(tài)語言,可以和java無縫集成,正是這個(gè)特性,很多時(shí)候把二者同時(shí)使用,把groovy作為java的有效補(bǔ)充。對(duì)于Java程序員來說,學(xué)習(xí)成本幾乎為零。同時(shí)支持DSL和其他簡(jiǎn)介的語法(例如閉包),使代碼便于閱讀??梢杂胓roovy的動(dòng)態(tài)特性來做規(guī)則引擎,在DB中維護(hù)腳本,業(yè)務(wù)變化的時(shí)候讓應(yīng)用系統(tǒng)動(dòng)態(tài)加載。如果引入groovy在java工程中?
這個(gè)很簡(jiǎn)單,不需要做別的事情,僅僅把groovy的二方包加入到pom文件中即可。例如:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version> 1.8 . 3 </version>
</dependency>
java和groovy混合使用的方法有幾種?
1、 靜態(tài)編譯 ,在java工程中直接寫groovy的文件,然后可以在groovy的文件中引用java工程的類,這種方式能夠有效的利用groovy自身的語言特性,例如閉包;
2、通過 groovyShell 類直接執(zhí)行腳本,例如:
package groovy_dsl.shell;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
public class GroovyShellEx {
public static void main(String[] args) {
Binding bind = new Binding();
bind.setVariable( "name" , "iamzhongyong" );
bind.setVariable( "age" , "25" );
GroovyShell shell = new GroovyShell(bind);
Object obj = shell.evaluate( "str = name+age;return str" );
System.out.println(obj);
}
}
3、通過 groovyScriptEngine 執(zhí)行文件或者腳本,例如:
package groovy_dsl.script;
import groovy.util.GroovyScriptEngine;
public class ScriptEngine {
public static void main(String[] args) throws Exception {
GroovyScriptEngine engine = new GroovyScriptEngine( "" );
Object obj = engine.run( "src/main/java/groovy_dsl/script/script_test.groovy" , "iamzhongyong" );
System.out.println(obj);
}
}
4、通過 GroovyClassLoader 來執(zhí)行,例如:
package groovy_dsl.classloader;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import java.io.File;
import java.io.IOException;
public class GroovyClassLoaderEx {
public static void main(String[] args) throws Exception, IOException {
GroovyClassLoader loader = new GroovyClassLoader();
for ( int i= 0 ;i< 100 ;i++){
Class<?> clazz = loader.parseClass( new File( "src/main/java/groovy_dsl/classloader/UserDO.groovy" ));
GroovyObject clazzObj = (GroovyObject)clazz.newInstance();
clazzObj.invokeMethod( "setName" , "iamzhongyong" );
clazzObj.invokeMethod( "setSex" , "Boy" );
clazzObj.invokeMethod( "setAge" , "26" );
System.out.println(clazzObj.invokeMethod( "getAllInfo" , null ));
}
}
}
使用groovy尤其需要主要的問題?
通過看groovy的創(chuàng)建類的地方,就能發(fā)現(xiàn),每次執(zhí)行的時(shí)候,都會(huì)新生成一個(gè)class文件,這樣就會(huì)導(dǎo)致JVM的perm區(qū)持續(xù)增長(zhǎng),進(jìn)而導(dǎo)致FullGCc問題,解決辦法很簡(jiǎn)單,就是腳本文件變化了之后才去創(chuàng)建文件,之前從緩存中獲取即可。
groovy中的源碼如下:
return parseClass(text, "script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy" );
這個(gè)是增加緩存的代碼:
GroovyClassLoader groovyClassLoader = new GroovyClassLoader(GroovyScriptExecute. class .getClassLoader());
Class<?> groovyClass = null ;
String classKey = String.valueOf(scriptClass.hashCode());
//先從緩存里面去Class文件
if (GroovyScriptClassCache.newInstance().containsKey(classKey)){
groovyClass = GroovyScriptClassCache.newInstance().getClassByKey(classKey);
} else {
groovyClass = groovyClassLoader.parseClass(scriptClass);
GroovyScriptClassCache.newInstance().putClass(classKey, groovyClass);
}
GroovyObject go = (GroovyObject)groovyClass.newInstance();
下面這個(gè)是緩存的單例類,貼一下:
public class GroovyScriptClassCache {
private static final Map<String /*class文件的描述*/ ,Class<?>> GROOVY_SCRIPT_CLASS_CACHE = new HashMap<String,Class<?>>();
private GroovyScriptClassCache(){}
private static GroovyScriptClassCache instance = new GroovyScriptClassCache();
public static GroovyScriptClassCache newInstance(){
return instance;
}
public Class<?> getClassByKey(String key){
return GROOVY_SCRIPT_CLASS_CACHE.get(key);
}
public void putClass(String key,Class<?> clazz){
GROOVY_SCRIPT_CLASS_CACHE.put(key, clazz);
}
public boolean containsKey(String key){
return GROOVY_SCRIPT_CLASS_CACHE.containsKey(key);
}
}
為啥要每次new一個(gè)GroovyClassLoader,而不是所有的腳本持有一個(gè)?
因?yàn)槿绻_本重新加載了,這時(shí)候就會(huì)有新老兩個(gè)class文件,如果通過一個(gè)classloader持有的話,這樣在GC掃描的時(shí)候,會(huì)認(rèn)為老的類還在存活,導(dǎo)致回收不掉,所以每次new一個(gè)就能解決這個(gè)問題了。
注意CodeCache的設(shè)置大小
對(duì)于大量使用Groovy的應(yīng)用,尤其是Groovy腳本還會(huì)經(jīng)常更新的應(yīng)用,由于這些Groovy腳本在執(zhí)行了很多次后都會(huì)被JVM編譯為native進(jìn)行優(yōu)化,會(huì)占據(jù)一些CodeCache空間,而如果這樣的腳本很多的話,可能會(huì)導(dǎo)致CodeCache被用滿,而CodeCache一旦被用滿,JVM的Compiler就會(huì)被禁用,那性能下降的就不是一點(diǎn)點(diǎn)了。
Code Cache用滿一方面是因?yàn)榭臻g可能不夠用,另一方面是Code Cache是不會(huì)回收的,所以會(huì)累積的越來越多(其實(shí)在不采用groovy這種動(dòng)態(tài)更新/裝載class的情況下的話,是不會(huì)太多的),所以解法一可以是增大code cache的size,可通過在啟動(dòng)參數(shù)上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那邊也是推薦把code cache調(diào)大的),二是啟用code cache的回收機(jī)制(關(guān)于Code Cache flushing的具體策略請(qǐng)參見此文),可通過在啟動(dòng)參數(shù)上增加:-XX:+UseCodeCacheFlushing來啟用。
以上就是關(guān)于動(dòng)態(tài)生成groovy腳本相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
新版抖音動(dòng)態(tài)去哪了(新版抖音動(dòng)態(tài)去哪了怎么刪除)
直播間虛擬動(dòng)態(tài)背景(綠幕虛擬直播間軟件免費(fèi))
質(zhì)量好的杭州企業(yè)宣傳片動(dòng)態(tài)(杭州品牌企業(yè))
游戲logo圖片素材(游戲logo圖標(biāo)設(shè)計(jì))
瓜州品牌策劃公司哪家好(瓜州品牌策劃公司哪家好一點(diǎn))