2011-10-06 128 views
2

我正在NetBeans中编写一个项目,但我需要使用javac编译它,因为它需要通过CLI构建和执行。我怎样才能做到这一点?我已经看到很多项目特定的答案,但没有一个适合我的问题。我读过的javac的人,并适当设置好的类路径:javac -cp .. MyMain.java,conssidering我的项目具有以下结构:如何使用javac编译Netbeans项目

src 
|_mainPackage 
      |_package2 
      |_package3 
      |_MyMain.java 

和我使用的是点格式在我的进口是这样的:

import package1.class1 
import package2.class2 

public class MyMain { 

    public static void main(String[] args) { 
    //Stuff with classes in package1 
      . 
      . 
      . 
    //Stuff with classes in package2 
      . 
      . 
      . 
    } 
} 

我不能使用ant,因为它是用CLI中的javac编译的,因为它是一个大学项目,并且受到教授的限制。

编辑: 事实上,我编译使用javac用命令[email protected]: mainPackage $ javac -cp .. MyMain.java我的消息来源,因为我进口使用点分格式,而“根包”位于“mainPackage”文件夹;但是,当我要去跑项目,我有这样的输出:

[email protected]: mainPackage $ java VideoRent 
Exception in thread "main" java.lang.NoClassDefFoundError: MyMain (wrong name: mymain/MyMain) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
Could not find the main class: MyMain. Program will exit. 
+0

正如你编译多个类相同的方式。你遇到的问题究竟是什么?你不知道如何“cd”到代表软件包根目录的文件夹?或者你不知道如何完全编译多个类?你能编译一个类吗? – BalusC

+0

它看起来像你正在设置你的CLASSPATH到你的当前目录“javac -cp.MyMain.java”之上的一个目录,这可能会导致你的问题。 – roartechs

+0

@BalusC:好吧,自从我上次用java编程以来,我有很长的一段时间,但是我记得我根本没有使用过软件包。我把我所有的类放在同一个文件夹下,然后执行'javac MainClas.java'进行编译,然后'java MainClass'运行;它处理我需要的每个依赖项。其实,使用上面的命令,我让它编译我的类,但后来我得到一个奇怪的错误。检查我的编辑。 – Throoze

回答

3

在一个干净的临时目录,请尝试这一系列命令。然后检查和了解的目录布局,包声明和各种路径设置,如-d bin-s src-cp bin

mkdir -p src/mainPackage 
echo "package mainPackage; public class MyMain { public static void main(String[] args) { System.out.println(\"Hello world\"); }}" > src/mainPackage/MyMain.java 
mkdir bin 
javac -d bin -s src src/mainPackage/MyMain.java 
java -cp bin mainPackage.MyMain 
+0

的文件夹中https://github.com/SpotterRF/json-examples/tree/master/java/jackson在Makefile中有一个很好的示例 – CoolAJ86

0

试试这个:

javac.exe -d class -s src src/myproject/mainpackage/*.java 
     src/myproject/mainpackage/package2/*.java 
     src/myproject/mainpackage/package3/*.java 

可以试试这也(Windows)中

for /r %%a in (*.java) do (javac "%%a")

+0

非常感谢!但是使用linux,我的项目将在Linux Debian上执行。我读过javac的man,并且说-d选项是要存储.class文件的目录,所以我无法将类传递给-d选项。任何想法在Linux? – Throoze

+0

-d类意味着将.class文件放在名为class ^^ – SHiRKiT