2012-09-20 7 views
1

J'ai un fichier jar qui a été transformé en .exe en utilisant L4J, et un autre fichier jar dans appdata. La raison d'avoir deux fichiers est que j'ai besoin d'un mécanisme de mise à jour.Comment faire pour exécuter un fichier jar d'un autre fichier

Ma question: Comment exécuter le fichier .exe sur le bureau, puis charger le fichier jar dans appdata?

+0

Utilisez [Java Web Start] (http://stackoverflow.com/tags/java-web-start/info) pour installer l'application. La mise à jour automatique est intégrée gratuitement et fonctionne sous Windows, OS X & * nix. –

+0

J'ai regardé web-start. Je pense que quelque chose que je fais moi-même pourrait être plus proffesional. Je veux ma propre interface graphique pour le programme de mise à jour/lanceur. – Mad3ngineer

+1

Ah. Typos. J'ajouterai cela dans toutes les questions que je pose à ce sujet. Je suis désolé de ne pas l'avoir compris, je ne pensais pas que cela faisait partie de la portée de la question. Je vais fournir plus d'informations à partir de maintenant. – Mad3ngineer

Répondre

2

Vous pouvez utiliser un URLClassLoader pour charger la deuxième Jar à l'exécution. En fonction de vos besoins, vous pouvez avoir besoin d'une interface de pontage (une qui existe dans les deux Jars) que vous appelez de votre 'exe' pour faire fonctionner le deuxième Jar ... ou simplement utiliser le second Jar main méthode;)

L'autre choix que vous avez est d'exécuter une autre machine virtuelle Java.

MISE À JOUR

Afin de séparer les deux éléments physiques de votre application. Vous avez un Jar enveloppé dans un EXE (aka launcher) et un autre Jar qui est votre application (aka l'application) (je suppose).

Donc. Votre lanceur ne devrait avoir absolument aucune idée de votre application (peu ou pas de dépendances de temps de compilation).

D'une certaine manière, nous devons charger dynamiquement l'application à partir du lanceur. Pour ce faire, nous avons besoin de quelques petites choses.

Nous devons être en mesure de charger l'application dans le contexte du chargeur de classe des lanceurs (afin que nous puissions le voir) et nous certains d'entre nous pour être en mesure de charger l'application.

Dynamic ClassLoading

Ceci peut être réalisé simplement par l'utilisation de URLClassLoader

URLClassLoader loader = new URLClassLoader(new URL[]{new File("path/to/your/jar/Application.jar").toURI().toURL()}); 

Chargement de l'application

Ceci peut être réalisé dans l'une des deux façons. Vous pouvez simplement utiliser le URLClassLoader pour trouver un lancement des applications main classe ...

// This is essentially the same as saying 
// the.package.name.to.you.main.class.Main.main(new String[]{}); 
Class<?> mainClass = loader.loadClass("the.package.name.to.you.main.class.Main"); 
Method mainMethod = mainClass.getMethod("main", String[].class); 
mainMethod.invoke(null, new String[]{}); 

Maintenant, si votre pot d'application ne dispose pas d'une méthode main, vous pouvez utiliser l'exemple ci-dessus pour lancer à peu près toutes les classes vous voulez ...

+0

Je ne comprends pas ce que vous venez de dire .. O_O – Mad3ngineer

+0

Ouais, j'ai aussi ce problème;) – MadProgrammer

+1

+1 belles explications et il y a aussi le mode de lancement cmd/c :) –

1

vous devez ajouter un pot, par à la classpath, par exemple: « c: \ monchemin \ myjar.jar » que vous mettrez à jour que myjar.jar

+0

Donc, vous ajoutez le chemin de classe aux métadonnées dans le jar enveloppé. Exe, Ensuite, exécutez la classe principale à partir du fichier. Exe la façon dont vous souhaitez charger une bibliothèque, non? – Mad3ngineer

+0

oui, et après chaque relance le nouveau jar est là, comme les fichiers .dll dans windows :) –

+0

Ok merci! Cela m'aide vraiment! – Mad3ngineer

Questions connexes