package in .java file makes class file unuseable

前端 未结 4 1759
忘掉有多难
忘掉有多难 2021-01-22 16:41

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 her

相关标签:
4条回答
  • 2021-01-22 16:54

    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:

    • The Java packages tutorial
    • Java packages tutorial
    • Oracle's notes on packages

    Good luck!

    0 讨论(0)
  • 2021-01-22 16:55

    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".

    0 讨论(0)
  • 2021-01-22 16:59

    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).

    0 讨论(0)
  • 2021-01-22 17:12

    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.

    0 讨论(0)
提交回复
热议问题