Skip to content
Advertisement

Compiling a java project from linux command line

I am having trouble understanding how to actually use the command line to run a big java project ( by big I mean with multiple files and folder).

Imagine I have a project containing :

~/src/main/fr/file1.java
~/src/main/fr/file2.java

~/src/test/test1.java

All my life people have done the makefile for me. I just code the java src with vim and compile and run with make. Now there is no makefile ! I compile with maven (that I am still understanding how it works.). After compiling with maven (I just run maven compile). I then have a new folder named target.

~/target/main/fr/file1.class
~/target/main/fr/file2.class


~/target/test/test1.class

Now how can I run test1 ? I tried using java -classpath =... test1 but I always get errors …

If can someone help me (or just give me some resources so I can finally understand basic project structuring and scripting) it will be amazing. Thank you !

Advertisement

Answer

Here is a minimal working example to compile java source files from multiple locations and pack them in a single runnable jar.

$ tree
.
├── makefile
├── src_folder_1
│   └── Main.java
└── src_folder_2
    └── Person.java

The contents of java files appear at the end for completeness. Here is the makefile.

BIN_DIR = bin
WITH_DEBUG_INFO = -g

.DEFAULT_GOAL:
app.jar:

compile_phase.done: ${SRC_FILES}
    @mkdir -p ${BIN_DIR}
    @javac ${WITH_DEBUG_INFO} ${SRC_FILES} -d ${BIN_DIR}
    @echo "DONE" >> $@

manifest.mf:
    @echo "Class-Path: ${BIN_DIR}/*.classnMain-Class: Mainn" > $@

app.jar: manifest.mf compile_phase.done
    @jar cfm $@ $< -C ${BIN_DIR} .
    @rm -rf ${BIN_DIR}
    @rm $^

See that all java source files are compiled within the same rule, and the corresponding *.class files are put in a dedicated bin directory. To emphasize that everything needed to run the jar is inside it I completely removed the bin directory and the manifest.mf. Now you can run the program with

$ java -jar app.jar oren
Hello oren

Here are the java files for completeness:

$ cat src_folder_1/Main.java 
class Main {
    static public void main(String[] args) {
        Person p = new Person(args[0]);
        System.out.format("Hello %sn",p.toString()); }}
$ cat src_folder_2/Person.java 
class Person {
    private String name;
    public Person(String n) { this.name = n;}
    public String toString() { return name; }}
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement