Realizarea unui fișier Java Makefile (Programare, Java, Makefile)

Dude a intrebat.
a intrebat.

EDIT: În esență, încerc să fac același lucru ca și cum aș tasta „javac sim.java” și apoi „java sim (comenzi)”. Există o modalitate de a înlocui acest lucru folosind un makefile?

Așa că m-am uitat la o mulțime de exemple online și am încercat să le modific în funcție de ceea ce am nevoie, dar nimic nu a funcționat. Am nevoie de un makefile pentru ca profesorul meu să poată crea proiectul meu doar tastând „make” în terminal (aceasta este o cerință a proiectului din anumite motive). Scopul meu final este de a putea tasta „sim” urmat de comenzile necesare, așa cum sunt definite de codul meu. Codul rulează în eclipse, dar nu reușesc să îl fac să ruleze folosind aceste comenzi în terminal. Va face fișierul, dar spune „sim: command not found” când încerc să tastez „sim….(arguments)” în terminal. sunt sigur că este o întrebare stupidă, dar nu am învățat despre asta la școală și nu am experiență cu Makefile.

Mai jos este makefile-ul meu.

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

Comentarii

  • Utilizați ant pentru Java. Este o interfață XML și destul de ușor de învățat și de folosit. Curba de învățare nu este atât de mare și, pe termen lung, este o abilitate și un instrument bun pentru cei care dezvoltă în Java. Acesta este modul în care oamenii creează de obicei mediul de construcție pentru proiectele Java, cel puțin pentru cele mai mari. Dar este perfect și pentru cele mai mici. Se scalează bine, vă permite să gestionați cazuri complexe sau să construiți variabile de mediu și lucruri care nu sunt neapărat cunoscute până în momentul construirii. –  > Por clearlight.
  • Nu aveți o rețetă definită pentru construirea sim de la sim.class. Deci, make nu face asta și nici un fișier numit sim nu este creat. –  > Por MadScientist.
  • o cerință a proiectului este ca profesorul să poată tasta pur și simplu „make” pentru a-l putea utiliza –  > Por Dude.
  • Ce vrei să spui prin „a folosi”? Să-l ruleze sau doar să fie gata de funcționare? –  > Por bmargulies.
  • să-l folosesc pentru a-l compila astfel încât să fie gata de execuție doar prin tastarea cuvântului „sim” –  > Por Dude.
4 răspunsuri
Jeff Miller

Pentru un proiect simplu, fără multe fișiere sau dependențe, folosesc pur și simplu scripturi.

Pentru a construi:

javac -cp .;* *.java

Pentru a rula:

java -cp .;* SomeMainClass

Înlocuiți . cu orice cale (căi) de care aveți nevoie pentru sursa dvs. * va folosi orice jar de pe calea implicită sau va folosi o cale diferită, cum ar fi lib/*.

bmargulies

Utilizarea make cu java poate fi un exercițiu de înșurubare a șuruburilor cu un ciocan, de îndată ce aveți mai mult de o clasă.

Codul java de lucru va folosi pachete. Astfel, veți avea un arbore de directoare complex care reflectă structura pachetelor, cu fișierele sursă .java în el. Scrierea unor reguli de creare care să „vadă” toate aceste fișiere este un chin.

Ar trebui să invocați javac pe toate fișierele sursă în același timp pentru a obține rezultate corecte. Așadar, modelul make obișnuit de „executați o comandă pentru a transforma un fișier sursă într-un fișier compilat” nu funcționează atât de bine.

Cu toate acestea, se pare că principala dvs. problemă în acest moment este că vă așteptați ca java să producă un executabil; un fișier cu un nume precum „sim”. Nu, nu se va întâmpla în niciun mod simplu. Compilatorul java produce fișiere .class; un întreg arbore de acestea pentru fișierele sursă. Puteți să le executați direct din ele sau le puteți împacheta într-un fișier JAR.

Pentru a ajunge până la ceva ce pare a fi un simplu executabil în linie de comandă, trebuie să folosiți un instrument mai complex, care înfășoară toate acestea cu un script în față.

Pentru moment, trebuie doar să faceți:

java -cp . NAME_OF_THE_CLASS_IN_sim.java

pentru a fi rulat după ce fișierul makefile se finalizează.

Jamie McLaughlin

make execută o rețetă prin executarea dependențelor sale, apoi a rețetei în sine. Prin urmare, dacă adăugați o comandă care execută codul compilat la rețeta de sus, tastând „make” va executa și codul după ce este compilat. Nu-mi vine să cred câți oameni nu știu acest lucru!

Ceva de genul:

sim: sim.class
    java sim

Va face ceea ce cere tutorele tău.

Comentarii

  • O bună practică este să adăugați .PHONY: sim astfel încât, dacă există accidental un fișier numit ‘sim’ în director, acesta va fi totuși rulat. –  > Por pjz.
Aron Hoogeveen

Dacă aveți o dispunere simplă a directoarelor, cum ar fi următoarea,

root/
    src/
        ExampleClass.java
        AnotherClass.java
    out/
makefile

ați putea să vă creați makefile în felul următor:

##
# source directory
##
SRC_DIR := src

##
# output directory
##
OUT_DIR := out

##
# sources
##
SRCS := $(wildcard $(SRC_DIR)/*.java)

##
# classes
## 
CLS := $(SRCS:$(SRC_DIR)/%.java=$(OUT_DIR)/%.class)

##
# compiler and compiler flags
##
JC := javac
JCFLAGS := -d $(OUT_DIR)/ -cp $(SRC_DIR)/

##
# suffixes
##
.SUFFIXES: .java

##
# targets that do not produce output files
##
.PHONY: all clean

##
# default target(s)
##
all: $(CLS)

$(CLS): $(OUT_DIR)/%.class: $(SRC_DIR)/%.java
    $(JC) $(JCFLAGS) $<

##
# clean up any output files
##
clean:
    rm $(OUT_DIR)/*.class