Erreur JAVA_HOME

Bonjour

Je cherche à mettre en place un serveur qui repose sur un logiciel java.
J’ai compilé le logiciel avec ant sur mon PC fixe, et je l’ai mis sur mon raspberry pi.

Quand je le lance :

$ ./start-linux.sh 
read log configuration
log4j:WARN No appenders could be found for logger (com.jolbox.bonecp.BoneCPConfig).
log4j:WARN Please initialize the log4j system properly.
[INFO] 03/06/16 09:44 CommunityDAO: Starting reload of soft state...
[INFO] 03/06/16 09:44 CommunityDAO: db sync took: 519 for 0
[INFO] 03/06/16 09:44 CommunityDAO: Registered: 0 infrastructure keys
[INFO] 03/06/16 09:44 EmbeddedServer: max_threads: 30
2016-06-03 09:44:41.179::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
[INFO] 03/06/16 09:44 CommunityDAO: Using user timeout: 86400000 seconds
[INFO] 03/06/16 09:44 CommunityDAO: Pruned 0 old peers
[INFO] 03/06/16 09:44 CommunityDAO: Starting reload of soft state...
[INFO] 03/06/16 09:44 CommunityDAO: db sync took: 60 for 0
[INFO] 03/06/16 09:44 KeyRegistrationServlet: Key registration servlet created.
[INFO] 03/06/16 09:44 SwarmPublishServlet: Swarm publishing servlet created.
[INFO] 03/06/16 09:44 EmbeddedServer: Authentication required for swarm publishing
[INFO] 03/06/16 09:44 EmbeddedServer: host: 192.168.X.X
[INFO] 03/06/16 09:44 EmbeddedServer: port: XXXX
2016-06-03 09:44:43.228::INFO:  jetty-6.1.x
2016-06-03 09:44:50.801::INFO:  Started SelectChannelConnector@192.168.X.X:XXXX
[INFO] 03/06/16 09:44 EmbeddedServer: started embedded server

C’est bon jusque là. :sunglasses:

Mais quand je me connecte au serveur avec Firefox (PC fixe) :

2016-06-03 09:45:17.881::WARN:  /
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
    at org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory.getCompiler(CompilerAdapterFactory.java:105)
    at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:924)
    at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
    at edu.washington.cs.oneswarm.community2.utils.IPServletFilter.doFilter(IPServletFilter.java:67)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:285)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
    at org.mortbay.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:463)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
    at edu.washington.cs.oneswarm.community2.utils.IPServletFilter.doFilter(IPServletFilter.java:67)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

J’ai ajouté la variable JAVA_HOME dans /etc/environment :
JAVA_HOME="/usr/lib/jvm/java-7-openjdk-armhf/"
suivi de source /etc/environment.

J’ai aussi essayé de pointer sur oracle-jdk-7 et 8 (avec leurs update-alternatives :wink:)

Voilà, je suis à court. Merci pour vos idées… :grinning:

Que donne «echo $JAVA_HOME» ? et le répertoire en retour de la commande précédente contient elle la JDK ?

Salut @Mimoza

Ça renvoie bien le chemin que j’ai mis :
/usr/lib/jvm/java-7-openjdk-armhf/

Tu sais si à l’intérieur de ce répertoire se trouve un JDK en regardant si tu trouves tools.jar, c’est ça ?
Si oui, alors ce répertoire contient bien un JDK.

Entre autre, dans ton répertoire te dois aussi avoir le fichier «bin/javac», c’est lui le compilateur et c’est lui qui manque d’après le message d’erreur.

Non, il y est bien… :confused:

Est-ce-qu’une compilation sur le raspberry au lieu de mon PC fixe changerait quelque chose tu penses ?

Je doute, même si Java est censé être portable il vaut mieux compiler sur l’environnement cible. Du coup un truc tout con mais as tu bien le JAVA_HOME dans ton path ? Ça donne quoi quand tu tape «javac» en console ?

D’ac. Voilà ce que la compilation donne sur mon raspberry pi : (erreurs)
https://paste.debian-fr.xyz/?f96f9a69eaaab6cb#6+qxLn42NjEZwK2r9N2kDjbK0n1hCW4zkCjHhhNHnxM=


Taper javac en console lance bien javac. Mais je n’avais pas $JAVA_HOME dans mon PATH.
Je l’ai rajouté à l’instant. Ça ne change rien à l’erreur initiale.
echo $PATH donne
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/lib/jvm/java-7-openjdk-armhf/

Pour ton PATH il faut ajouter le «/bin» sinon il ne vas rien trouver. Si en tapant «javac» en console ça te lance bien le compilateur alors pas besoin d’ajouter le JAVA_HOME a ton path, il y a surement un lien qui fait le boulot pour toi.

Sinon pour ta compile il te manque des librairies, c’est pour cela qu’il gueule. «error: package javax.servlet.http does not exist»
Tu dois avoir loupé une étape dans l’installation du soft «http://www.oneswarm.org/»
Tu as bien suivi les étapes du wiki ? https://github.com/CSEMike/OneSwarm/wiki/Building-on-Ubuntu

Sinon tu as Java 7 et ils recommande 6, mais je ne pense pas que ça change grand chose, c’est rétrocompatible normalement.

Je me suis renseigné sur le tout 1er warning : http://stackoverflow.com/a/15882869

Il s’avère que mon PC fixe possède openjdk6 -> pas de problème de compilation
mais mon raspberry pi ne possède que les jdk 7 et 8 -> cross-compiling

Je suis passé sous openjdk-6 sur le raspberry. +/- mêmes librairies manquantes après erreur de compil’…
Du coup, je ne sais pas quoi installer pour les avoir. :confused:

Je cherche à installer un serveur pour oneswarm.

Quand tu compile en Java tu le fait pour TOUTES les vm qu’elle soit x86 ou ARM. Une des doctrine de Java est «compile once, run everywhere». Donc finalement ce que tu as compilé sur ta machine de bureau peu tout a fait être exécuté sur ton Rpi … normalement, s’il n’y a rien de bizarre/hors Java.
Et ce que tu as compilé en Java 6 peut tout a fait fonctionner sur un vm 7 ou 8 (l’inverse non évidemment).
Donc il n’y a pas de «cross-compilation», d’ailleurs tu emploi mal le terme. Normalement il sert a désigné le fait que tu compile sur une architecture pour une autre architecture CPU, genre sur du x86 pour de l’ARM.
Attention Java compile les source en bytecote intermédiaire, qui est valable pour toutes les vm, c’est pour cela que l’on ne peut pas parler de cross-compilation dans son cas.

Quel est le résultat de la compilation sur ta machine ? un fichier «.jar» ? .war ? .ear ? .class ?

Merci pour les explications ^^
Du coup, j’abandonne la compilation sur le raspberry ! :slight_smile:

La compilation réussie sur mon PC fixe donne des fichiers .class dans des sous-répertoires du répertoire war/WEB-INF/classes/


Est-ce-que tu veux que je te passe les sources+ce que j’ai compilé pour que tu puisses mener tes tests plus rapidement sur ta machine ? :blush:
(J’ai l’impression que le problème n’est pas simple)

Voilà l’archive au cas où tu voudrais tester : https://cloud.woelkli.com/index.php/s/VaqdipxR1X07d1Q

Tu auras juste besoin de créer une BDD community_db dans mysql
CREATE DATABASE community_db;
(manips expliquées dans le lien “serveur pour oneswarm” plus haut)

de renommer sample-community.conf en community.conf et modifier 2-3 paramètres à l’intérieur,

puis de lancer start-linux.sh

:wave:

En parcourant le code source, regarde ce que j’ai trouvé dans start-linux.sh :
JAVA_HOME=/usr/lib/jvm/java-6-sun
export JAVA_HOME
:rage:
Je suis fou ! C’était sous mon nez depuis le début !

Merci encore de ton aide @Mimoza

Si tu as un fichier .war alors ta n’as plus qu’a le déposer sur ton serveur d’application (Tomcat je suppose). Si c’est un répertoire tu zip tout ce qu’il y a dedans et te met l’extension «.war» et tu déploie.

Si tu as résolu ton pb de variable JAVA_HOME tant mieux alors, ca veux peut être dire que tu as Java 6 d’installé sur ta machine fixe.

En fait, j’avais beau définir la variable dans /etc/environment, vérifier que echo $JAVA_HOME me retournait bien ce que je voulais,…
j’avais toujours l’erreur ~vous avez mal défini JAVA_HOME~.

En fait, c’est simplement parce que le script de lancement (start-linux.sh) la re-définissait vers un chemin faux !