Abhängig von JRE Programm starten

Snape

Erfahrenes Mitglied
Moin,
folgende Überlegung:
Ich habe ein Programm, welches auf Java 5 Funktionalität zurückgreift beim Drucken.
Nun möchte ich entweder diese Funktionalität deaktivieren, wenn Java <5 installiert ist oder ein anderes Programm starten. Mit "anderes Programm" meine ich eigentlich das gleiche wie mit Java 5 geschriebene, nur eben ohne Druckfunktionalität und mit JDK 1.4.2 compiliert.
Das Problem sollte klar sein: Mit Java 5 kompilierte Programme werden mit Java <5 gar nicht erst starten.

Weiß jemand wie das geht?
 
Hallo!

Ermittle die Java Version (zuverlaessig) mit commons-lang -> http://jakarta.apache.org/commons/lang/api-release/org/apache/commons/lang/SystemUtils.html

Ich wuerde die Klassen die spezielle Java 5 API verwenden dynamisch laden bzw. diesen Teil des Programms in ein separates Jar auslagern und dieses dann je nach JVM Version dynamisch zum classpath hinzufuegen und dann die Klassen dynamisch laden. Weiterhin wuerde ich der Anwendung dann nur erlauben ueber ein Interface mit dem "Modul" kommunizieren zu lassen.

Gruss Tom
 
Hallo Tom,
hast Du ein Beispiel zur Hand, wie das mit dem dynamischen Laden und zum classpath hinzufügen aussehen kann?
Wieso kann ich die Java-Version nicht einfach mit System.getProperty("java.version") ermitteln?
 
Hallo!

Ich bastel in der Mittagspause mal einen kleinen Prototyp...
System.getProperty("java.version")
Klar geht das auch damit, aber warum sich selber darum kuemmern,wenns schon jemand anderes gemacht hat? Weiterhin kann man sich bei einer eigenen Implementierung nie sicher sein, dass Sun oder wer auch immer nicht mal das Versionsnummern Muster aendert...

Gruss Tom
 
Hallo!

Schau aml hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.apache.commons.lang.SystemUtils;

import de.tutorials.module.IServiceModule;

/**
 * @author daritho
 * 
 */
public class ModuleExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        if (SystemUtils.IS_JAVA_1_5) {
            addUrlToClasspath((URLClassLoader) Thread.currentThread()
                    .getContextClassLoader(), new File("lib/module_jdk15.jar")
                    .toURL());

        } else if (SystemUtils.IS_JAVA_1_4) {
            addUrlToClasspath((URLClassLoader) Thread.currentThread()
                    .getContextClassLoader(), new File("lib/module_jdk14.jar")
                    .toURL());
        } else{
            //Load dummy implementation...
        }

        IServiceModule serviceModule = (IServiceModule) Class.forName(
                "de.tutorials.module.impl.ServiceModuleImpl").newInstance();
        System.out.println(serviceModule.businessOperation(new String[] { "a",
                "b", "c" }));
    }

    private static void addUrlToClasspath(URLClassLoader classLoader, URL url)
            throws NoSuchMethodException, IllegalAccessException,
            InvocationTargetException, MalformedURLException {
        Method method = URLClassLoader.class.getDeclaredMethod(
                "addURL",
                new Class[] { URL.class });
        method.setAccessible(true);
        method.invoke(classLoader, new Object[] { url });
    }
}

Gruss Tom
 

Anhänge

Hallo Tom,
ich habe das zwar nicht so ganz verstanden, werde das aber bestimmt an mein Programm anpassen können.

Danke.
 
Zurück