Java 애플리케이션 내에서 GroovyScriptEngine
을 사용하여 다른 소스에서 동적으로 코드를로드합니다. 두 개의 폴더 sources_A\
및 sources_B\
이 있다고 가정 해 보겠습니다.충돌하는 이름으로 groovy 클래스로드하기
GroovyScriptEngine engine = new GroovyScriptEngine(new String[]{
"sources_A", "sources_B"
});
각 폴더에는 런타임에 임의로 인스턴스화하려는 Groovy 패키지와 클래스가 있습니다.
문제점 : 이러한 클래스 중 일부는 두 폴더에서 모두 (전체) 이름을 갖습니다. 두 개체가이 두 가지에서 인스턴스화 할 때
GroovyScriptEngine engine_A = new GroovyScriptEngine(new String[]{"sources_A"});
GroovyScriptEngine engine_B = new GroovyScriptEngine(new String[]{"sources_B"});
하지만 내가 문제로 실행 : 나는 두 개의 서로 다른 엔진을 만들 수 있습니다, 물론
engine.loadScriptByName("some.package.SomeClass").newInstance()
:
그래서 내가 실행할 때 모호성이있다 서로 다른 엔진이 상호 작용해야한다 :
object_from_A.someMethod(object_from_B);
Error: argument type mismatch at line ** in method foo in file bar.groovy
(이 어떤 유형 불일치 없다고 말할 필요도없이 : 개체가 올바른 유형이 있지만, 다른 엔진으로 인해 인식되지 않습니다) :
당신이 해결책을해야합니까, 짧은에서중 하나에
- 어떤 소스 폴더가 사용되었는지 명확히하기위한 하나의 엔진 솔루션이 있습니까?
- 서로 다른 두 엔진의 객체를 함께 사용하는 두 가지 방법이 있습니다.
한 번에 하나의 버전을로드하고 싶습니다. 문제는 내가로드 된 버전을 제어 할 수 없다는 것입니다. 클래스 로더에게로드해야하는 두 가지 버전을 알려주는 방법이 없습니까? –
Nope. 당신은 그것을 제어 할 수 없습니다. 좋은 소식은 코드를 클래스에로드 한 후 선택 논리를 코드에 통합하고 올바른 소스 코드 디렉토리만으로 엔진을 만드는 것입니다. – JBaruch