有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么如果我试图从包中执行一个包含main()方法的类,我会得到一条错误消息?

我有一个Main类,其中包含Main()方法,该方法声明在名为mainPkg的包中

现在,我使用ANT脚本使用Javac执行编译,如下:

<target name="compile" depends="clean">

    <mkdir dir="build/classes"/>

    <echo>INTO compile TASK</echo>
    <echo>BASE DIR: ${basedir}</echo>
    <echo>CLASSPATH: ${basedir}\lib\ojdbc6.jar</echo>

    <javac srcdir="src/mainPkg/" destdir="build/classes">

        <classpath>
            <fileset refid="classpath.compile"/>
        </classpath>

    </javac>
</target>

好的,它可以工作,并创建编译的Main。类此目录中的文件(位于项目根目录中):build/classes/mainPkg/(最后一个目录具有包名)

好的,现在我的疑问是:如果我进入build/classes/文件夹并在这里执行以下操作,为什么

java mainPkg.Main

它是有效的,事实上,我得到了这个输出(在某些时候有一个例外,但这是另一个与我现在所问的问题无关的问题):

C:\Projects\edi-sta\build\classes>java mainPkg.Main
Hello World !!!
0
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at mainPkg.Main.main(Unknown Source)

但是如果我进入build/classes/mainPkg/目录(包),它就不工作了,我会得到一条错误消息“无法找到或加载主类”

事实:

 Directory di C:\Projects\edi-sta\build\classes\mainPkg

12/02/2015  17:39    <DIR>          .
12/02/2015  17:39    <DIR>          ..
12/02/2015  17:39             1.190 Main.class
               1 File          1.190 byte
               2 Directory   8.091.906.048 byte disponibili

C:\Projects\edi-sta\build\classes\mainPkg>java Main
Errore: impossibile trovare o caricare la classe principale Main

你能解释一下为什么会这样吗

Tnx


共 (2) 个答案

  1. # 1 楼答案

    it works, infact I obtain this output (at certain times there is an exception but this is another problem not related at what I am asking at this time):

    虽然这不是问题的目的,但出现异常是因为oracle驱动程序jar文件不在类路径中。要修复此错误,请使用-cp选项将jar文件ojdbc6.jar添加到类路径

    But if I enter into the build/classes/mainPkg/ directory (the package) it don't works and I obtain an "impossible to find or load main class" error message?

    mainPkg.Main是java类的完全限定名。您需要将其提供给java运行时环境,以便它能够找到并运行该类^仅{}是不够的,因为类路径中可能有许多java文件的类名为Main

    更多信息请访问documentation

    By default, the first argument without an option is the name of the class to be called. A fully qualified class name should be used.

  2. # 2 楼答案

    如果您注意到源文件中有Main的包语句。像这样的java

    package mainPkg;
    public class Main{
    
    }
    

    在编译时,您是说我的Main类有一个名为mainPkg的命名空间。既然已经为类定义了名称空间,那么任何试图访问Main的尝试都应该具有类似mainPkg.Main的名称空间前缀,我们通常称之为完全限定类名

    在build/classes中调用java mainPkg.Main时,JVM将首先检查当前目录中是否有mainPkg子文件夹。因为它已经在那里了,它进入内部并找到Main,验证完全限定的类名是否与我们在java命令中给出的匹配,如果相同,它将加载您的类并执行main()

    当您从build/classes/mainPkg运行相同的java mainPkg.Main时,这一次在mainPkg中没有名为mainPkg的子文件夹,因此它会抛出您看到的错误

    希望这有意义:)