# LSEnvironment ne marche pas avec mon application Netbeans



## neopium (2 Juillet 2008)

Bonjour à tous !

Voilà, j'ai créé une appli Netbeans (en Java, donc). Netbeans s'occupe de faire tout le packaging pour MacOSX de mon application et un double-clic suffit à la lancer.

Pour faire marcher mon application, j'ai besoin d'une variable d'environnement, DYLD_LIBRARY_PATH. Je l'ai donc rajoutée dans mon fichier ~/.MacOSX/environment.plist et tout marche parfaitement.

Seulement, je souhaiterais, pour faciliter l'installation sur d'autres machines (et éviter d'écraser les variables d'environnement des autres applications), que la variable soit spécifique à l'application.

J'ai lu que cela était possible. J'ai donc suivi les instruction et modifié le fichier info.plist comme suit :

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
  <dict>

    <key>CFBundleName</key>
    <string>vtktest</string>
    
    <key>CFBundleVersion</key>
    <string>0.1</string>
    
    <key>CFBundleExecutable</key>
    <string>vtktest</string>
    
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    
    <key>CFBundleShortVersionString</key>
    <string>0.1</string>
    
    <key>CFBundleSignature</key>
    <string>????</string>
    
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    
    <key>CFBundleIconFile</key>
    <string>vtktest.icns</string>

    <key>LSEnvironment</key>
    <dict>
        <key>DYLD_LIBRARY_PATH</key>
        <string>/Users/ben/MaLib</string>
    </dict>
  </dict>
</plist>
```

Mais l'application ne marche plus car il ne trouve plus ma librairie !

Que faire ?

Merci


----------



## neopium (2 Juillet 2008)

J'ai trouvé deux solutions de contournement...

1) J'ai édité le fichier Contents/MacOs/vtktest et ajouter la commande export
=> ca marche, mais j'ai modifié un script de lancement... argh, c'est moche

2) en lisant ceci (la partie "Prelude") et cela, j'ai créé un fichier Prelude.sh qui règle la variable DYLD_LIBRARY_PATH et j'ai modifié le fichier Info.plist pour qu'il appelle Prelude.sh plutôt que vtktest.sh.
=> ça ne marche pas : il faut déplacer l'appli sur le bureau, la lancer et la redéplacer vers sont lieu d'origine... et là ça marche... Mais au final, ce n'est pas très pratique !

Pourquoi dans le 2) doit-on déplacer l'application ?
Quelqu'un a-t-il une meilleure solution ?


----------



## tatouille (2 Juillet 2008)

rafraichir le bundle, tu auras surement remarquer que le launch des application est assez rapide sur Macos cela en fait partie, les caches que ce soit des resources ou des images binaires, par rapport a d'autres platformes

c'est toujours preferable d'avoir dans le MacOS folder un binaire,

puis export tes settings pour la vm depuis celui-ci, j'avais ecrit ce genre de truc foireux il y a fort longtemps, et c'etait temporaire, car il y avait un bug dans le java application stub, et c'etait un moyen de le contourner


```
#!/bin/sh

AppDir=`dirname "${0}"` // caveat: paths with space

#$
#$ AppDir=$(dirname "${0}" | sed "s/ /\\\ /g")
#$ 

ResourcesDir="${AppDir}"/../Resources
JAVAROOT="${AppDir}"/../Resources/Java
WorkingDirectory="${JAVAROOT}"
UserDirectory="${HOME}"/Library/Margo
#arg="Margo"
arg=""

if [ -n "${2}" ]; then
    arg=`basename "${2}"|sed 's/\.zargo//g'`
fi

JAVAMAIN="${JAVAROOT}"/argouml.jar
MARGO_MAIN=org.argouml.application.Main

MARGO_CLASSES="${JAVAROOT}"/toolbar.jar:\
"${JAVAROOT}"/swidgets.jar:\
"${JAVAROOT}"/openide-util.jar:\
"${JAVAROOT}"/ocl-argo.jar:\
"${JAVAROOT}"/nsuml.jar:\
"${JAVAROOT}"/nbmdr.jar:\
"${JAVAROOT}"/mof.jar:\
"${JAVAROOT}"/mdrapi.jar:\
"${JAVAROOT}"/log4j.jar:\
"${JAVAROOT}"/jmiutils.jar:\
"${JAVAROOT}"/jmi.jar:\
"${JAVAROOT}"/java-interfaces.jar:\
"${JAVAROOT}"/gef.jar:\
"${JAVAROOT}"/commons-logging.jar:\
"${JAVAROOT}"/argouml-model.jar:\
"${JAVAROOT}"/argouml-mdr.jar:\
"${JAVAROOT}"/antlrall.jar

MARGO_EXT=

#MARGO_EXT="${JAVAROOT}"/ext/argo_classfile.jar:\
#"${JAVAROOT}"/ext/argo_idl.jar:\
#"${JAVAROOT}"/ext/argouml-i18n-nb.jar:\
#"${JAVAROOT}"/ext/argo_cpp.jar:\
#"${JAVAROOT}"/ext/argo_php.jar:\
#"${JAVAROOT}"/ext/argouml-i18n-zh.jar

mkdir -p "${HOME}"/Library/Margo
echo "" > "${HOME}"/Library/Margo/argouml.log

ln -sf /usr/bin/java "${AppDir}"/Margo_Java

(cd "${HOME}"/Library/Margo && "${AppDir}"/Margo_Java \
-cp "${JAVAMAIN}":"${MARGO_CLASSES}" \
-Djava.library.path="${JAVAROOT}":"${JAVAROOT}/ext" \
-Duser.home="${UserDirectory}" \
-Duser.dir="${UserDirectory}" -Xdock:name=Margo \
-Xdock:icon=$ResourcesDir/MargoApplication.icns \
-Dcom.apple.macos.use-file-dialog-packages=true \
-Dcom.apple.macos.smallTabs=true \
-Dapple.laf.useScreenMenuBar=true \
-Dcom.apple.mrj.application.live-resize=true \
-Dcom.apple.mrj.application.main="${MARGO_MAIN}" \
-Dcom.apple.mrj.application.classpath="${JAVAMAIN}":"${MARGO_CLASSES}":"${MARGO_EXT}" \
-Dcom.apple.mrj.application.workingdirectory="${WorkingDirectory}" \
-Dapple.awt.brushMetalLook=false \
-Dcom.apple.mrj.application.growbox.intrudes=false \
-jar "${JAVAMAIN}" -nopreload \
"${arg}" > "${HOME}"/Library/Margo/argo.consol)
```
toute fois si tu veux ecrire un simple executable qui execute ton script bash: fais un tour ici

http://DXFunction.c

http://sysinfo_test.c

ou utilises le java application stub qui demarre une instance de vm ansi tu peux ajouter tes confs dans le dic java du info.plist de ton bundle


----------



## neopium (3 Juillet 2008)

Merci pour ta réponse



tatouille a dit:


> rafraichir le bundle, tu auras surement remarquer que le launch des application est assez rapide sur Macos cela en fait partie, les caches que ce soit des resources ou des images binaires, par rapport a d'autres platformes



Par rafraîchir, tu veux dire supprimer les répertoires "cachedir" ?



> c'est toujours preferable d'avoir dans le MacOS folder un binaire,



Pas sûr d'avoir bien compris. De quel binaire parles-tu ? Dans le dossier Contents/MacOs/, j'ai un lien vers le script de lancement, lui-même situé dans Contents/Resources/monAppli/bin, et mon fichier Prelude.sh qui fait les export de variables avant d'appeler le script de lancement.



> puis export tes settings pour la vm depuis celui-ci, j'avais ecrit ce genre de truc foireux il y a fort longtemps, et c'etait temporaire, car il y avait un bug dans le java application stub, et c'etait un moyen de le contourner
> 
> 
> ```
> ...



 Ca va un peu vite pour moi, là 
Je n'ai pas de Java Application Stub... A vrai dire, je découvre un peu ce que c'est en lisant ton message. Je développe mon appli à destination de plusieurs plate-formes, je ne suis pas un développeur Apple à la base. Netbeans a beau être écrit en Java, l'exécution de la JVM est déléguée au script de lancement. C'est un script sh qui va commander l'exécution de l'appli netbeans. Je peux très bien modifier le fichier et inclure mes export au début, mais je préférais ne pas avoir à y toucher (il est généré automatiquement par Netbeans, ça facilite le packaging). Apparemment, c'est le seul moyen (avec le script Prelude...).


----------



## tatouille (3 Juillet 2008)

cache non


```
current_path=$(pwd)

fs_update () {
    touch "$1"
    osascript <<EOF 
set UnixPath to "$1"
set MacOSPath to (POSIX file UnixPath) as string
ignoring application responses
    tell application "Finder" to update file MacOSPath
end ignoring
EOF
}

fs_update "$1"

cd $current_path

exit 0
```
fait un script avec ca et ajoute le dans un post flight target argument 1 etant le target du built bundle

binaire == executable == binary machine code pas un script qui est dependent des droits qui lui son alloue, je pensais netbean un peu plus serieux...

pour to script auto-gerener il doit y avoir un endroit pour ajouter des options
ou alors fais un script post flight qui le modifie automatiquement


----------

