IDEAJava项目使用Groovy文件编译的时候报错的解决, 以及Groovy的使用

Cannot compile Groovy files: no Groovy library is defined for module

1. 引入插件

模块需要引入插件和依赖 . 如下

${project.basedir} 是pom中的常量 , 项目的路径

/src/main/java/cn/com/baidu/message/groovy  是我的groovy文件所在的包路径

    <dependencies>  
        <dependency>
            <artifactId>groovy-all</artifactId>
            <groupId>org.codehaus.groovy</groupId>
            <version>3.0.9</version>
            <type>pom</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.6.1</version>
                <configuration>
                    <sourceEncoding>UTF-8</sourceEncoding>
                    <sources>
                        <source>
                            <directory>${project.basedir}/src/main/java/cn/com/baidu/message/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </source>
                    </sources>
                    <testSources>
                        <testSource>
                            <directory>${project.basedir}/src/main/test/cn/com/baidu/message/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </testSource>
                    </testSources>
                    <!-- 用maven编译时需要加encoding:mvn -Dfile.encoding=UTF-8 compile  -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>addSources</goal>
                            <goal>addTestSources</goal>
                            <goal>compile</goal>
                            <goal>compileTests</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2. 插件使用

Maven的Plugins中会出现gplus的插件 , 点击compile先编译groovy文件 , 编译后在target查看是否编译成功 , 如果没有出现编译后的文件 , 那肯定是第一步的路径没有配置对 

3. 编译方式

然后点击模块的compile再进行编译 , 注意:每次模块clear后 , 都需要先执行第二步再编译模块本身

如果没有compileGroovy或者没有compile模块 , 则会出现

Cannot compile Groovy files: no Groovy library is defined for module 模块名

下面是我写的groovy工具类 , 用于执行页面传过来的JavaScript函数

package cn.com.baidu.groovy

import com.alibaba.fastjson.JSONObject
import jdk.nashorn.api.scripting.ScriptObjectMirror
import javax.script.*

/**
 * Groovy动态条件封装请求参数
 */
class APIStartJavaScript{

    // 查找并创建指定脚本引擎
    private ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");

    Object executeScriptFunction(Object params, String script){
        // 初始化Bindings
        Compilable compilable = (Compilable) engine;
        Bindings bindings = engine.createBindings(); //Local级别的Binding
        // 绑定参数
        bindings.put("request", params);
        try {
            // 解析编译脚本函数
            CompiledScript JSFunction = compilable.compile(script);
            // 获取执行结果
            Object result = JSFunction.eval(bindings);
            if(result == null) {
                JSONObject jsonObject = new JSONObject();
                return jsonObject;
            }
            if (result instanceof ScriptObjectMirror) {
                // 遍历所有值
                ScriptObjectMirror scriptObjec = (ScriptObjectMirror) result;
                // 递归处理查询结果的数组
                recursionEencapsulation(scriptObjec);
                return scriptObjec;
            }else {
                return result;
            }
        } catch (Exception e) {
            if (e instanceof javax.script.ScriptException || e instanceof NoSuchMethodException) {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("scriptException", e.getMessage());
                return jsonObject;
            }else{
                throw e;
            }
        }
        return null;
    }

    // 递归封装数组
    public void recursionEencapsulation(ScriptObjectMirror scriptObject) {
        for(String key : scriptObject.keySet()){
            Object mirror = scriptObject.get(key);
            if (mirror instanceof ScriptObjectMirror) {
                recursionEencapsulation(mirror);
                Boolean isArray = isArray(mirror);
                if(isArray) {
                    List<Object> list = parseArray(mirror);
                    scriptObject.put(key, list);
                }
            }
        }
    }

    // 判断是否为数组
    public Boolean isArray(ScriptObjectMirror scriptObject) {
        boolean isArray = true;
        int index = 0;
        for(String key : scriptObject.keySet()){
            if(!key.equals(index+"")) {
                isArray = false;
            }
            index++;
        }
        return isArray;
    }

    // 将数组转为ArrayList
    public List<Object> parseArray(ScriptObjectMirror scriptObject) {
        List<Object> arrayList = new ArrayList<Object>();
        for(String key : scriptObject.keySet()){
            Object obj = scriptObject.get(key);
            arrayList.add(obj);
        }
        return arrayList;
    }

}

4. 报错解决

如果在编译groovy的时候你引入了你的java类出现下面错误

而在项目中又调用了这个groovy, 在编译maven项目的时候, 同时会报错找不到groovy。

这种原因一般是因为groovy引入的这个java类比较特殊 , 里面又引入了别的依赖包里的java类。

解决办法

1. 先不要在groovy里面引入java类,先保证groovy编译成功。

2. 如果是在groovy的方法参数传入的java类, 那就先暂时注释掉java代码中对groovy的调用。

3. 对maven项目进行编译。

4. 修改groovy文件 ,引入需要的java类,编译groovy。

5. 修改你的java类,去掉对groovy调用的注释,再次编译maven项目。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值