Compiling
-d is output directory for new generated class files.
How to compile single Java source file
javac -d ./target/classes src/main/java/com/extuni/enum_demo4/App.java
How to compile multiple Java source files
javac -d ./target/classes
./src/main/java/com/extuni/enum_demo4/App.java
./src/main/java/com/extuni/enum_demo4/Greeting.java
./src/main/java/com/extuni/enum_demo4/Helper.java
How to compile multiple Java source files using wildcard
javac -d ./target/classes ./src/main/**/*.java
How to specify dependency jar file when compiling
Trying to compile ./src folder completely will throw exception due to junit.jar file dependency. So, it should be specified using -cp option which means –classpath as below.
javac -d ./target/classes -cp /Users/kenanhancer/.m2/repository/junit/junit/4.11/junit-4.11.jar ./src/**/*.java
or
javac -d ./target/classes --class-path /Users/kenanhancer/.m2/repository/junit/junit/4.11/junit-4.11.jar ./src/**/*.java
or
javac -d ./target/classes -classpath /Users/kenanhancer/.m2/repository/junit/junit/4.11/junit-4.11.jar ./src/**/*.java
Packaging – creating jar file
jar CLI some options are the following
-v, –verbose Generate verbose output on standard output.
-f, –file=FILE The archive file name.
-C DIR Change to the specified directory and include the following file
-x, –extract Extract named (or all) files from the archive
-t, –list List the table of contents for the archive
-c, –create Create the archive
-e, –main-class=CLASSNAME The application entry point for stand-alone applications bundled into a modular, or executable, jar archive
1- Package
jar cf ./target/enum_demo3-1.0-SNAPSHOT.jar -C ./target/classes .
or
jar cfv ./target/enum_demo3-1.0-SNAPSHOT.jar -C ./target/classes .
new generated enum_demo3-1.0-SNAPSHOT.jar file is added in ./target folder.
1.1- Package with new manifest file
If you see the following error in your terminal, it mean we have to specify Main-Class property in the manifest file when we are packaging.
While packaging, we should specify main entrance class. So, we should create Manifest.txt file with Main-Class property as the following and one empty line
jar cfm ./target/enum_demo3-1.0-SNAPSHOT.jar ./Manifest.txt -C ./target/classes .
or
jar cfe ./target/enum_demo3-1.0-SNAPSHOT.jar com.extuni.enum_demo3.App -C ./target/classes .
1.2- Updating existing jar with new manifest file
jar ufm ./target/enum_demo3-1.0-SNAPSHOT.jar Manifest.txt
2- Extracting
jar xf ./target/enum_demo3-1.0-SNAPSHOT.jar
or
jar xfv ./target/enum_demo3-1.0-SNAPSHOT.jar
2.1- Extracting only files under a specific package
jar xfv ./target/enum_demo3-1.0-SNAPSHOT.jar
3- Viewing content of a jar file
jar tf ./target/enum_demo3-1.0-SNAPSHOT.jar
or
jar tfv ./target/enum_demo3-1.0-SNAPSHOT.jar
Running – the main() method
-cp or –class-path or -classpath is class path for Java application.
java -cp ./target/classes com.extuni.enum_demo4.App
or
java --class-path ./target/classes com.extuni.enum_demo4.App
or
java -classpath ./target/classes com.extuni.enum_demo4.App
How to specify other project's compiled class folder in -classpath when running
javac -d ./target/classes -cp ../enum_demo3/target/classes ./src/main/java/com/extuni/enum_demo4/App.java
How to specify other project's packaged jar file in -classpath when running
javac -d ./target/classes -cp ../enum_demo3/target/enum_demo3-1.0-SNAPSHOT.jar ./src/main/java/com/extuni/enum_demo4/App.java
Running – jar file
java -jar usage
if the jar file has a Main-Class defined in manifest file, the following command will run.
java -jar ./target/enum_demo3-1.0-SNAPSHOT.jar
java -cp usage
Execute another class with a public static void main
method. So, -cp mean class path
java -cp ./target/enum_demo3-1.0-SNAPSHOT.jar com.extuni.enum_demo3.App
Sample Scenario – Using one project in other Java Project as a dependency
If we have one Java project which uses other Java project as a dependency, then we have to specify those dependencies in javac and java commands.
So I will have two projects named enum_demo3 and enum_demo4
enum_demo4 project will use Greeting class's sayHello() method in enum_demo3 project.
For example
Compiling enum_demo3 project
javac -d ./target/classes ./src/main/java/com/extuni/enum_demo3/*.java
or
javac -d ./target/classes ./src/main/*/.java
I want to use Greeting class written in enum_demo3 project above. So i used it as below.
Compiling enum_demo4 project
javac -d ./target/classes -cp ../enum_demo3/target/classes ./src/main/java/com/extuni/enum_demo4/App.java
or
javac -d ./target/classes -cp ../enum_demo3/target/classes ./src/main/**/*.java
or
javac -d ./target/classes -cp ../enum_demo3/target/enum_demo3-1.0-SNAPSHOT.jar ./src/main/**/*.java
Running main method
java -cp "./target/classes:../enum_demo3/target/classes" com.extuni.enum_demo4.App
or
java -cp "./target/classes:../enum_demo3/target/enum_demo3-1.0-SNAPSHOT.jar" com.extuni.enum_demo4.App