ما هي أفضل طريقة لاكتشاف ما إذا كان التطبيق قد تم تشغيله بواسطة Webstart أم لا

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

  •  03-07-2019
  •  | 
  •  

سؤال

كما وضح في كلامي السؤال الأخير, تحتاج تطبيقات Swing إلى استدعاء System.exit() بشكل صريح عند تشغيلها باستخدام مشغل Sun Webstart (على الأقل اعتبارًا من Java SE 6).

أريد تقييد هذا الاختراق قدر الإمكان وأبحث عن طريقة موثوقة لاكتشاف ما إذا كان التطبيق يعمل ضمن Webstart.أتحقق الآن من أن قيمة خاصية النظام "webstart.version" ليست فارغة، لكن لم أتمكن من العثور على أي ضمانات في الوثائق بوجوب تعيين هذه الخاصية بواسطة الإصدارات المستقبلية/التطبيقات البديلة.

هل هناك أي طرق أفضل (ويفضل تلك التي لا تعتمد على واجهة برمجة تطبيقات webstart؟)

هل كانت مفيدة؟

المحلول

وعندما يتم تشغيل التعليمات البرمجية عبر javaws، يتم تحميل javaws.jar وهي الطبقات API JNLP أنك لا تريد أن تعتمد على المتاحة. بدلا من اختبار لخاصية النظام الذي لا يضمن في الوجود، هل يمكن أن نرى بدلا من ذلك في حالة وجود فئة 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 (سلسلة) وUnavailableServiceException هو مشكلة لأن كلاهما جزء من API JNLP. وServiceManager.getServiceNames () لم يتم توثيقها لرمي. نحن ندعو على وجه التحديد هذا الرمز إلى التحقق من وجود NoClassDefFoundError.

نصائح أخرى

استخدم في javax.jnlp.ServiceManager لاسترداد خدمة webstart و. إذا كانت تلتقطها، تقوم بتشغيل تحت webstart و.

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

وكما ذكرتم، والتحقق من ملكية النظام على النحو التالي هو على الارجح أنظف الطريقة:

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

في نظام إنتاج ولقد استخدمت تقنية أعلاه لسنوات.

ويمكنك أيضا محاولة للتحقق لمعرفة ما إذا كان هناك أي الخصائص التي تبدأ ب "jnlpx". ولكن أيا من تلك هي حقا "ضمان" أن يكون هناك إما بقدر ما أعرف.

وبديل يمكن أن يكون محاولة مثيل DownloadService لنا اقترحه توم:

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) باستخدام العناصر أو.

ثم تحقق لمعرفة ما إذا تم تعيين هذه الخصائص.

مرة أخرى، هذا اقتراح لم أقم بترميزه لـ JWS وقد لا يكون الأمر بهذه السهولة.

ويمكنك التحقق ما إذا كان classloader الحالي هو مثيل com.sun.jnlp.JNLPClassLoader (جافا المساعد 1) أو sun.plugin2.applet.JNLP2ClassLoader (جافا المساعد 2). وعلى الرغم من حزمة "الصغير"، وهو برنامج صغير باستخدام JNLP مع البرنامج المساعد جافا 2 يستخدم classloader آخر، sun.plugin2.applet.Applet2ClassLoader. وهي تعمل مع OpenJDK جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top