KdgDev
KdgDev

Reputation: 14529

package in .java file makes class file unuseable

It's been too long since I've last done Java, and I can't remember why the following happens:

Given this file, created by a standard Maven project, as can be seen here: Maven Tutorial

package com.mycompany.app;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

Compiling this, not even with Maven but with the standard javac executable, will generate a class file without errors. Try to run the class file, and you get this error:

Exception in thread "main" java.lang.NoClassDefFoundError: App (wrong name: com/mycompany/app/App)

Remove the package command, compile again and it runs just fine. Why is this? I'm running JDK 1.6.0_21 btw.

Upvotes: 2

Views: 1837

Answers (4)

vstoyanov
vstoyanov

Reputation: 881

This is because in Java filesystem files map to classes (e.g. each public class must be in a separate eponymous file) and packages map to directories.

So if you have a class which is in the com.mycompany.app package it must be in com/mycompany/app directory relative to the classpath.

In your case you should have an output directory, say and the you should have the class in /com/mycompany/app/App.java. Then you build it, running javac from and giving com/mycompany/app/App.java as parameter, instead of com/mycompany/app/App.java.

Running the class works in an analogical way, but you give the fully-qualified-name of the class, instead of the directory path.

Upvotes: 0

user405725
user405725

Reputation:

One thing you must do after creating a package for the class is to create nested subdirectories to represent package hierachy of the class. In your case the package name is "com.mycompany.app" so the App.class (compiled App.java file) should reside in "com/mycompany/app" sub-directory. It doesn't matter where the source file is residing though. For example, I have copied your file and did the following:

$ ls
App.java
$ javac App.java 
$ ls
App.class       App.java
$ mkdir -p com/mycompany/app
$ mv App.class com/mycompany/app/
$ java com.mycompany.app.App
Hello World!
$ 

Please read Wikipedia page about Java Packages for more information. You can also take a look at these links:

Good luck!

Upvotes: 8

Jas
Jas

Reputation: 1141

You need to add the com/mycompany/app folder to your Java CLASSPATH . If I remember well, you can also do it from the cmdline using the parameter "-cp".

Upvotes: 0

Nate W.
Nate W.

Reputation: 9249

When you attempt to execute your program, it will look for the class file using the path specified in the package. So, when you have the package statement in the file, your class file must be in the com/mycompany/app/ directory (relative to what directory you're attempting to run it from); if it can't find it, you get that exception.

Thus, when you remove that package statement, the JVM will look for it in current directory, which is why it works (because you're executing java App in the same directory in which the App.java and App.class files exist).

Upvotes: 0

Related Questions