WebStart에서 응용 프로그램을 시작하는지 여부를 감지하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/216315

  •  03-07-2019
  •  | 
  •  

문제

그것이 내에서 분명해졌습니다 최근 질문, 스윙 애플리케이션은 SUN WebStart 런처 (적어도 Java SE 6 기준)를 사용하여 System.exit ()를 명시 적으로 호출해야합니다.

이 해킹을 가능한 한 많이 제한하고 싶습니다. 응용 프로그램이 WebStart에서 실행 중인지 여부를 감지 할 수있는 신뢰할 수있는 방법을 찾고 있습니다. 지금은 시스템 속성 "webstart.version"의 값이 NULL이 아니지만이 속성이 향후 버전/대체 구현에 의해 설정되어야한다는 보장을 찾을 수 없었습니다.

더 나은 방법이 있습니까 (바람직하게는 WebStart API에 의존하지 않는 방법은 무엇입니까?)

도움이 되었습니까?

해결책

Javaws를 통해 코드가 시작되면 javaws.jar가로드되고 의존하지 않으려는 JNLP API 클래스가 사용할 수 있습니다. 존재하지 않는 시스템 속성을 테스트하는 대신 JNLP API 클래스가 존재하는지 확인할 수 있습니다.

private boolean isRunningJavaWebStart() {
    boolean hasJNLP = false;
    try {
      Class.forName("javax.jnlp.ServiceManager");
      hasJNLP = true;
    } catch (ClassNotFoundException ex) {
      hasJNLP = false;
    }
    return hasJNLP;
}

또한 컴파일시 수업 경로에 javaws.jar를 포함시킬 필요는 없습니다.

또는 javaws.jar로 컴파일하고 대신 noclassdeffounderror를 잡을 수 있습니다.

private boolean isRunningJavaWebStart() {
    try {
        ServiceManager.getServiceNames();
        return ds != null;
    } catch (NoClassDefFoundError e) {
        return false;
    }
}

servicemanager.lookup (string) 및 availableServiceException 사용은 모두 JNLP API의 일부이기 때문에 문제입니다. servicemanager.getServiceNames ()는 쓰러지는 문서화되지 않았습니다. 우리는 특별히이 코드를 호출하여 noclassdeffounderror를 확인하고 있습니다.

다른 팁

javax.jnlp.servicemanager를 사용하여 WebStart 서비스를 검색하십시오. 그것이 availabe 인 경우, 당신은 WebStart에서 실행 중입니다.

보다 http://download.java.net/jdk7/docs/jre/api/javaws/jnlp/index.html

당신이 언급했듯이, 다음과 같이 시스템 속성을 확인하는 것은 아마도 가장 깨끗한 방법 일 것입니다.

private boolean isRunningJavaWebStart() {
    return System.getProperty("javawebstart.version", null) != null;
}

생산 시스템에서 나는 수년 동안 위의 기술을 사용해 왔습니다.

"JNLPX"로 시작하는 속성이 있는지 확인할 수도 있습니다. 그러나 그 중 어느 것도 내가 아는 한 실제로 "보장"되지 않습니다.

대안은 Tom이 제안한 다운로드 서비스를 인스턴스화하는 것입니다.

private boolean isRunningJavaWebStart() {
    try {
        DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService");
        return ds != null;
    } catch (UnavailableServiceException e) {
        return false;
    }
}

물론 코드를 해당 API에 연결하는 단점이 있습니다.

나는 몇 년 전에 그것을 보는 것 외에 다른 Java Web Start에 대한 실제 경험이 없습니다.

Java Web Start를 통해 앱을 시작할 때 설정 한 것보다 정의하는 매개 변수로 애플리케이션을 시작하는 것은 어떻습니까?

앱에 인수를 전달하려면 사용 또는 요소를 사용하여 시작 파일 (일명 JNLP 디스크립터)에 추가해야합니다.

그런 다음 이러한 속성이 설정되어 있는지 확인하십시오.

다시 이것은 JW를 코딩하지 않은 제안이며 쉽지 않을 수도 있습니다.

현재 클래스 로더가 com.sun.jnlp.jnlpclassloader (java plugin 1) 또는 sun.plugin2.applet.jnlp2classloader (java plugin 2)의 인스턴스인지 확인할 수 있습니다. "애플릿"패키지에도 불구하고 Java 플러그인 2가 장착 된 JNLP를 사용하는 애플릿은 다른 클래스 로더 인 Sun.plugin2.applet.applet2classloader를 사용합니다. OpenJDK 와도 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top