2010-09-15 18 views
0

Je crée un fichier JAR exécutable qui utilise la bibliothèque série RxTx. Il nécessite l'accès à rxtxSerial.dll et je veux que le JAR le mette automatiquement. De cette façon, je n'ai pas besoin d'un installateur - juste un JAR autonome. Cela peut-il être fait?Un programme Java peut-il placer une DLL dans C: Windows?

Quand j'appelle nouvelle FileOutputStream (new File ("C: /Windows/rxtxSerial.dll")), je reçois l'exception suivante:

java.io.FileNotFoundException: C: \ Windows \ rxtxSerial.dll (Accès refusé)

Merci,

Neal

Répondre

2

Les autorisations vous empêcheront d'écrire dans les répertoires système des versions modernes de Windows. Même si le système vous permet de le faire, ce ne serait pas une bonne pratique. En empaquetant votre application avec One-Jar, vous pouvez regrouper vos bibliothèques natives dans le fichier jar, et elles seront développées et ajoutées au classpath lors de l'exécution.

Il est facile à intégrer dans une construction Ant ou Maven. En prime, vous pouvez également inclure toutes les bibliothèques dépendantes et autres ressources dans le fichier jar, et ils seront tous étendus aux fichiers temporaires lors de l'exécution.

En fourmi, reconditionner votre pot existant ressemblerait à quelque chose comme ceci:

<one-jar destfile="libraryWithNativeCode.jar"> 
    <manifest> 
     <attribute name="One-Jar-Main-Class" value="${main.class}"/> 
    </manifest> 

    <main jar="libraryWithoutNativeCode.jar" /> 

    <binlib> 
     <fileset dir="${bin.dir}" includes="rxtxSerial.dll"/> 
    </binlib> 
</one-jar> 
1

Oui, vous pouvez mettre un fichier DLL dans le dossier système. Cependant, les dernières versions de Windows implémente User Access/Account Control ce qui peut vous empêcher de le faire si vous n'avez pas assez de privilèges. Peu importe la langue ou l'outil que vous utilisez pour aborder cela. Pour que votre application Java puisse placer des fichiers dans C: \ Windows, elle doit être exécutée en tant qu'administrateur. Mais obliger l'utilisateur à exécuter l'application en tant qu'administrateur tout le temps peut ne pas être très pratique pour l'utilisateur. Donc, ce que je suggère de faire est de vérifier si le fichier est déjà là, sinon, déclencher UAC et le copier là-bas. Dans ce cas, les privilèges d'administrateur ne seront requis qu'une seule fois. Voici un très bon billet de blog par Mark S. Kolich sur how to trigger UAC from Java.

Espérons que ça aide.