Création d'un Makefile Java


EDIT: Essentiellement, j'essaie de faire la même chose que de taper "javac sim.java" puis "java sim (commandes)". Existe-t-il un moyen de remplacer cela en utilisant un makefile?

J'ai donc regardé beaucoup d'exemples en ligne et essayé de les modifier en fonction de mes besoins, mais rien n'a fonctionné. J'ai besoin d'un makefile pour que mon enseignant peut créer mon projet, simplement en tapant "make" dans le terminal (c'est une exigence du projet pour une raison quelconque). Mon objectif final est de pouvoir taper " sim " suivi du commandes requises telles que définies par mon code. Le code s'exécute dans eclipse, mais je ne peux pas le faire fonctionner en utilisant ces commandes dans terminal. Il fera le fichier, mais il dit "sim: commande introuvable" quand j'essaie de taper "sim....(arguments)" dans le terminal. Je suis sûr que c'est une question stupide mais nous n'avons pas appris à ce sujet à l'école et je n'ai aucune expérience avec Makefile.

Ci-dessous est mon makefile.

JFLAGS = -g
JC = javac
OPT = -O3
#OPT = -g
WARN = -Wall

sim: sim.class

sim.class: sim.java
    $(JC) $(JFLAGS) sim.java

clean:
    $(RM) sim.class

clobber:
    $(RM) sim.class
Author: Dude, 2015-03-21

3 answers

L'utilisation de make avec java peut être un exercice d'entraînement des vis avec un marteau dès que vous avez plus d'une classe.

Le code java fonctionnant utilisera des paquets. Vous aurez donc une arborescence de répertoires complexe qui reflète votre structure de package, avec votre .fichiers source java dedans. Écrire des règles qui "voient" tous ces fichiers est une douleur.

Vous devez invoquer javac sur tous vos fichiers source en même temps pour obtenir des résultats corrects. Donc, le modèle de make habituel de ' exécuter une commande pour en tourner une fichier source dans un fichier compilé " ne fonctionne pas si bien.

Cependant, il semble que votre principal problème pour le moment soit que vous vous attendez à ce que java produise un exécutable; un fichier avec un nom comme 'sim'. Non, ne va pas se produire de manière simple. Le compilateur java produit .fichiers de classe; un arbre entier d'entre eux pour vos fichiers source. Vous pouvez exécuter directement à partir d'eux, ou vous pouvez les empaqueter dans un fichier JAR.

Pour aller jusqu'à quelque chose qui semble être une simple ligne de commande exécutable, vous devez utiliser un outil plus complexe qui enveloppe tout cela avec un script sur le devant.

Pour l'instant, il vous suffit de faire:

java -cp . NAME_OF_THE_CLASS_IN_sim.java

À exécuter une fois votre makefile terminé.

 5
Author: bmargulies, 2015-03-21 16:40:50

Pour un projet simple sans beaucoup de fichiers ou de dépendances, j'utilise simplement des scripts.

Pour construire:

javac -cp .;* *.java

Pour exécuter:

java -cp .;* SomeMainClass

Remplacez . par le(s) chemin (s) dont vous avez besoin pour votre source. Le * utilisera n'importe quel jar sur le chemin par défaut ou utilisera un chemin différent comme lib/*.

 3
Author: Jeff Miller, 2015-03-21 16:32:49

Make exécute une recette en exécutant ses dépendances, puis la recette elle-même. Par conséquent, si vous ajoutez une commande qui exécute votre code compilé à la recette supérieure, taper 'make' exécutera également le code après sa compilation. Je ne peux pas croire combien de personnes ne le savent pas!

Quelque Chose comme:

sim: sim.class
    java sim

Fera ce que votre tuteur exige.

 0
Author: Jamie McLaughlin, 2018-02-01 20:58:52