2016-06-28 2 views
0

이걸로 console.log 기능을 javax.script.ScriptEngine에 추가했습니다.javax.script.ScriptEngine 콘솔 확장 또는 라이브러리?

public class Console { 
     public void log(String text){ 
      System.out.println("console: " + text); 
     } 
    } 

    private static ScriptEngine getJavaScriptEngine(){ 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 

    Console console = new Console(); 
    engine.put("console", console); 

    return engine; 
    } 

콘솔 및 경고 등은 구현의 일부가 아닙니다. 많은 검색 후 나는 단지 여기에서 발견했다. 그리고 eleswhere는 단지 같은 성명 그러나 이것을하는 도서관이 없는지 궁금하게 생각하고있다?

답변

1

비슷한 솔루션이 있지만 개체/배열의 서식을 지정하지 않는다는 것을 알았습니다. 또한 여러 인수 (예 : console.log('this is the answer:', 42))를 처리하지 않습니다.

이 문제를 해결하려면 console을 polyfill해야했습니다. 모든 기능을 지원하는 것은 아니지만 로깅을 목적으로합니다. 객체와 배열을 JSON으로 포맷하려면 JSON 객체를 사용할 수없는 것처럼 보였습니다. 따라서 객체를 polyfill해야했습니다.

아마 이것에 더 예쁜 해결책이있다, 그러나이 설정은 내가 가고 있어요 :

  1. Polyfill JSON 개체, 여기에 언급 된 스크립트를 가지고 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON#Polyfill합니다. Rhino는 약 window을 알고, 그래서 대체하지 않습니다

    if (!window.JSON) { 
        window.JSON = { 
        // ... rest of code ... 
        }; 
    } 
    

    기준 : src/main/resources/scripts/json.js 아래에 저장

    // if (!window.JSON) { 
        // window. 
        JSON = { 
        // ... rest of code ... 
        }; 
    // } 
    

    .

  2. 다음, console 객체에 대해 src/main/resources/scripts/console.js에 다음과 같은 내용을 넣어 :이 console 구현이 log 전역 변수를 사용

    console = { 
        _format: function(values) { 
        var msg = []; 
        for (var i=0;i<values.length;i++) 
         msg.push(JSON.stringify(values[i])); 
        return msg.join(', '); 
        }, 
        log: function() { 
        log.fine(console._format(arguments)); 
        }, 
        info: function() { 
        log.info(console._format(arguments)); 
        }, 
        warn: function() { 
        log.warning(console._format(arguments)); 
        } 
    }; 
    

    하는 것으로. 필자의 경우 이것은 JUL Logger 인스턴스이지만 약간의 창의력으로 다른 로깅 프레임 워크 (예 : SLF4j)를 사용하도록 변경할 수 있습니다.

  3. 마지막으로, 자바 코드에서 모두 함께 이것을 넣어, 다음과 같이 수행 할 수 있습니다

    public class ConsoleTest { 
    
        public static void main(String... args) throws ScriptException, IOException { 
         ScriptEngineManager factory = new ScriptEngineManager(); 
         ScriptEngine engine = factory.getEngineByName("JavaScript"); 
    
         engine.put("log", Logger.getLogger("script")); 
         run(engine, "/scripts/json.js"); 
         run(engine, "/scripts/console.js"); 
    
         engine.eval("console.log('string value');"); 
         engine.eval("console.warn(['array','value']);"); 
         engine.eval("console.info({a:1,b:'two'});"); 
        } 
    
        private void run(ScriptEngine engine, String resourceName) throws ScriptException, IOException { 
         InputStream in = getClass().getResourceAsStream(resourceName); 
         Reader reader = new InputStreamReader(in, Charset.forName("UTF-8")); 
         engine.eval(reader); 
         reader.close(); 
        } 
    
    } 
    
+0

꽤 멀리 보이는, 그것을 공유 주셔서 감사합니다! 그러나 JVM이 새로운 버전에서 1.9를 도울 것 같아서. – user3732793

관련 문제