2014-12-23 4 views
0

우리는 독립 실행 형 Java 응용 프로그램을 가지고 있습니다. 이 응용 프로그램에는 많은 기능이 있지만 대부분의 고객은이 기능을 약간만 사용합니다. 우리는 타사 jar 파일의 "정상적인"최소값으로 응용 프로그램을 배포하려고합니다. 이클립스 프로젝트에서 모든 외부 jar 파일은 클래스 경로에 있습니다. 따라서 수업을 시작하는 데 반사가 사용되지 않습니다. 따라서 사용자가 웹캠 사진을 찍는 등보다 고급 기능을 사용하려고 할 때 우리는 모든 javacv jar 파일을 다운로드 한 다음 사진을 찍는 클래스를 호출하기 전에 클래스 패스/클래스 로더에이를 추가합니다. 이것이 가능한가? 필자는 매우 작은 모듈을위한 해결책을 가지고 있습니다. 즉, jar 파일을 즉시 다운로드하여 사용자 정의 클래스 로더에 추가하는 것이지만, 모든 클래스를 고통스럽게 인스턴스화해야하고 모든 메소드를 리플렉션으로 호출해야합니다. 예를 들면 :리플렉션없이 런타임에 jar 파일을 클래스 경로에 추가 및 추가

URLClassLoader loader = new URLClassLoader(urls,w.getClass().getClassLoader()); 
Class grabberClass = Class.forName("org.bytedeco.javacv.FrameGrabber",true,loader); 
Object grabber = grabberClass.getMethod("createDefault", int.class).invoke(null, 0); 
grabberClass.getMethod("start", null).invoke(grabber, null); 
//And so on... 

이 우리가 원하는 것이 아니다. 우리의 모든 소스 코드는 괜찮 았고, 리플렉션 호출로 변환하여 난독 화하고 싶지 않습니다. 하지만 어떻게하면 기존 코드를 사용할 수 있으며 런타임에 jar 파일을 추가 할 수 있습니까?

답변

0

반성 할 필요가 없습니다. 클래스 경로에서 javacv jar 파일없이 응용 프로그램을 실행 해보십시오. 웹캠 기능을 절대 사용하지 않고 응용 프로그램을 모 놀리 식 방식으로 코딩하지 않았다면 다른 클래스가 코드에서 참조 할 때까지 Java가 클래스를로드하지 않으므로 아무런 문제가 없어야합니다 (또는 상속하거나 메소드 서명 또는 필드 유형으로 사용). 로부터 설치/다운로드 할 수

 
<!DOCTYPE jnlp PUBLIC "-//Sun Microsystems, Inc//DTD JNLP Descriptor 6.0.10//EN" 
         "http://java.sun.com/dtd/JNLP-6.0.10.dtd"> 
<jnlp version="1.6" 
     codebase="http://www.example.com/ourstandaloneapp/" 
     href="OurStandaloneApp.jnlp"> 
    <information> 
     <title>Our Stand-alone App</title> 
     <vendor>Example, Inc.</vendor> 
     <homepage href="http://www.example.com/ourstandaloneapp/"/> 
     <description>A stand-alone application with many capabilities.</description> 
     <icon kind="default" href="standalone.gif"/> 
     <offline-allowed/> 
    </information> 

    <security> 
     <all-permissions/> 
    </security> 

    <resources> 
     <j2se version="1.7+"/> 
     <jar href="OurStandaloneApp.jar" main="true"/> 
     <jar href="http://search.maven.org/remotecontent?filepath=org/bytedeco/javacv/0.10/javacv-0.10.jar" 
      download="lazy"/> 
    </resources> 

    <application-desc/> 
</jnlp> 

웹 시작 응용 프로그램이 없습니다 :

수요에 jar 파일을 다운로드하는 것처럼,은 .jnlp 파일에 게으른 구성 요소를 Java Web Start를 사용하고 그들에게 만드는 것을 고려 편물. javaws -codebase file:/path/to/media -import OurStandAloneApp.jnlp을 실행하는 설치 미디어의 바로 가기 또는 스크립트와 함께 CD 또는 플래시 드라이브에 실제로 패키지 할 수 있습니다. 자세한 내용은 here을 참조하십시오. (Java 6 이상에서는 페이지가 삭제 된 이유는 모르겠지만 매우 유용합니다.)

+0

답변 해 주셔서 감사합니다. 전에 webstart를 사용했지만 lazy-option에 대해 몰랐습니다. 이것은 내가 원하는 것을하는 것처럼 보입니다. 나는 크리스마스 후에이 해결책을 시도 할 것이다. – runholen