Search code examples
javacommand-linecompilationjava-package

How do I compile my main Java program on the command line when it includes an external java package?


I'm a relative Java newbie so apologies if the question appears somewhat basic. I've googled high and low for an answer here and I'm not finding anything that's helping.

Problem:

Whilst I'm able to integrate external packages into my Java programs from an IDE environment, I am trying to do run a very basic program from the command line that calls on a separate, basic package file that I have written - and am simply doing all this as I want to have a bottom-up understanding of how package files are related to a main program by Java.

I have a program that sits on my desktop named MyProgram.java:

import org.somepackage;

public class MyProgram {

    public static void main(String arguments[]) {

    System.out.println("Programme up and running...");
    Human myHuman = new Human(); 
    myHuman.scream();

  }

Still on the Desktop, I then have another folder which I've named src, inside of which I have created the necessary subfolders corresponding to the package name, i.e. ./src/org/somepackage - and in this location, I have the Human.java file which defines the Human class with the following contents:

package org.somepackage;

public class Human {

    public void scream() {

    System.out.println("I exist!!");

  }

}

I then created a classes folder, again on the Desktop, and ran the following compile command on the command line:

javac -d ./classes/ ./src/org/packagename/Human.java

This ran fine and created - as expected - the Human.class file within the ./classes/org/packagename/ location.

However, where I fall down is when I then try to compile MyProgram.java on the command line, i.e.

javac -cp ".:./classes/" MyProgram.java

As you'll see, my class path contains a reference to the current location (".") for the MyProgram.java file, and it contains a reference to the classes folder ("./classes/") which is the base location for the org.somepackage package inside whose subfolders (./classes/org/somepackage/) on can find the Human.class file.

At this stage, I was simply expecting the java engine to compile MyProgram.java into the program MyProgram.class - but, instead, I get an error:

MyProgram.java:1: error: package org does not exist

I've been following the instructions listed here:

https://www3.ntu.edu.sg/home/ehchua/programming/java/J9c_PackageClasspath.html

and I don't appear to be deviating from the instructions - yet I'm unable to locate an explanation on Stackoverflow or anywhere else as to a possible reason for this compile failure. If anyone has an idea, your help would be very much appreciated.

Thanks,


Solution

  • Your mistake is here

    import org.somepackage; <--
    
    public class MyProgram {
    
        public static void main(String arguments[]) {
    
        System.out.println("Programme up and running...");
        Human myHuman = new Human(); 
        myHuman.scream();
    
      }
    

    you forgot to import class actually, you need to write this name import org.somepackage.Human; import all package content import org.somepackage.*; or write full qualified name of class in your code

    org.somepackage.Human myHuman = new org.somepackage.Human(); 
    myHuman.scream();
    

    correct mistake:

    import org.somepackage.Human;
    
    public class MyProgram {
    
        public static void main(String arguments[]) {
    
        System.out.println("Programme up and running...");
        Human myHuman = new Human(); 
        myHuman.scream();
    
      } 
    

    after that compile your Human.java by this command:

    javac -d classes Human.java
    

    and MyProgram.java

    javac -d classes -cp "classes" MyProgram.java
    

    and run MyProgram by

    java -cp "classes" MyProgram