2012-01-08 3 views
0

나는캐스트

--> : Inherit 

TwittEntititesNetwork --> TwitterGephiStreamer 

TwittGrapher   --> TwitterGephiStreamer 

TwitterGephiStreamer is Abstract 
TwitterGephiStreamer have a method : myMethod() 

Directory 
    ./myApp.jar 
    ./NetworkLogicDirectory/TwittGrapher.jar 
    ./NetworkLogicDirectory/TwittEntititesNetwork.jar 

내가 동적으로 (다른 .jar 파일에있는) 딸 클래스

public static TwitterGephiStreamer LoadNetworkLogicJar() throws Exception 
    { 
     File dir = new File(NetworkLogicDirectory); 
     URL[] urls = new URL[dir.listFiles().length]; 
     for(int i = 0;i < dir.listFiles().length;i++) 
     { 
      File s = dir.listFiles()[i]; 
      String url = "file:///"+s.getAbsolutePath(); 
      urls[i] = new URL(url); 

     } 
     ClassLoader = new URLClassLoader(urls); 

     if(defaultProps.containsKey("NetworkLogic") && !defaultProps.getProperty("NetworkLogic").isEmpty()) 
     { 
      Class<?> networkLogicClassLoader = ClassLoader.loadClass("org.naoyun.gephistream.networklogic."+defaultProps.getProperty("NetworkLogic")); 
      Object object = networkLogicClassLoader.newInstance(); 



      return (TwitterGephiStreamer) object; 
     } 
     else 
     { 
      throw new Exception("blabalbalbal "); 
     } 
    } 
을로드하려면이 코드를 사용하여이 조직에 어떤 수업을

그래서 정상적인 클래스로 사용할 수있는 TwitterGephiStreamer를 반환해야하며 정상적으로 myMethod()를 사용할 수 있습니다.

eclispe에서 실행할 때 오류가 발생하지 않습니다.

java.lang.ClassCastException: org.naoyun.gephistream.networklogic.TwittEntitiesNetwork cannot be cast to org.naoyun.gephistream.TwitterGephiStreamer 
     at org.naoyun.utils.ConfigurationTools.LoadNetworkLogicJar(ConfigurationTools.java:62) 
     at org.naoyun.TwitterStreamer.<init>(TwitterStreamer.java:34) 
     at org.naoyun.TwitterStreamer.main(TwitterStreamer.java:26) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 

그래서, 나는이 문제를 해결하는 방법을 모른다 : 나는 실행 가능한 .JAR (myApp.jar)로 내 응용 프로그램을 내보낼 때

그것은 나에게이 오류가 발생합니다. 소름 끼치는 코드일까요?하지만 Eclispe는 즉시 처리 할 수 ​​있습니까? 그렇지 않은 다른 것들이 있습니까?

시간 내 주셔서 감사합니다.

+0

왜 새 인스턴스를 이렇게 만들면됩니까? – Paul

+0

글쎄, 누군가 다른 사람이 TwitterGephiStreamer로부터 상속받은 클래스를 만든다면, 그는 단지 자신의 클래스와 함께 jar 파일을 적절한 디렉토리에 넣고 클래스를 사용하기를 원한다고 말한다. – Totetmatt

+0

이클립스와 내 보낸 jar 파일이 동일한 .class 생성을 사용하고 있습니까? – jenaiz

답변

0

아마도 동적 클래스 경로에 org.naoyun.gephistream.TwitterGephiStreamer가 두 번 이상 포함되어있을 것입니다. 하위 클래스가로드되면 이전로드 된 복사본과 충돌하는 TwitterGephiStreamer 사본이로드됩니다.

TwittGrapher.jar 및 TwittEntititesNetwork.jar는 동일한 핵심 클래스/인터페이스 (즉, TwitterGephiStreamer)에 의존하므로, 이러한 유형을 별도의 유틸리티 병에 넣을 것을 제안합니다. 이 클래스 패스에 중복 된 유형을 제거하는 데 도움이 깨끗한 항아리 종속성 트리를 제공한다 :

  myApp 
     / \ 
TwittGrapher TwittEntitiesNetwork 
     \  /
     TwittUtil 
0

당신은 당신의 실행 항아리를 구축하는 Eclipse를 사용하는 것이 아니라 수동으로, 예를 들어, 하나를해서는 안 Ant 빌드 스크립트 사용.

Eclipse가 실행 가능한 jar를 빌드 할 때 스택 트레이스에서 참조되는 "jarinjarloader"패키지에있는 자체 클래스 로더를 통해 종속 jar를로드하여 모든 것을 하나의 깔끔한 패키지로 패키지화합니다. 이 클래스 로더는 Eclipse가 빌드 한 "omni-jar"의 일부가 아닌 경우 외부 jar를 찾을 수 없습니다.

이전에 URLClassLoader을 사용하여 런타임에 외부 jar를로드하려고합니다. 여기에 그것을 사용하는 방법을 설명 SO에 대한 질문은 Is it possible to “add” to classpath dynamically in java?

이 튜토리얼 실행 단지 구축 Ant를 사용하여 도움이

: Build an executable jar file by referencing your dependencies

Ant tutorial 비슷한입니다 이클립스로 작업을 수행하는 방법을 보여줍니다 하지만 매니페스트의 종속성은 설정하지 않습니다. 런타임시로드 할 외부 jar가 아닌 핵심 애플리케이션 클래스에 대해이 작업을 수행해야합니다.

+0

Ok xx 좀 보겠습니다. – Totetmatt