2010-08-18 97 views
9

嗨,我一直在使用IDE,但现在我需要从命令行运行和编译。使用Java中的命令行编译多个软件包

问题是我有多个包,我试图找到答案,但没有任何工作。

所以我

src/ 
    Support/ (.java files) 
    Me/ (.java files) 
    Wrapers/ (.java files) 

你知道如何编译用javac一切吗?

回答

6

这应该做它(可能需要通过-cp命令行开关的其他路径元素):

javac Support/*.java Me/*.java Wrapers/*.java 

但是,如果你的构建过程变得更加复杂(它会!),你应该考虑使用Apache Ant用于构建自动化。

+2

+1 - 对于一个外部最少的项目依赖,Ant比(例如)Maven更简单。他的IDE甚至可以生成一个初始的“build.xml”文件。 – 2010-08-18 13:39:33

+0

谢谢我试过这个,它编译所有东西,但它不会生成类结构,所以当我尝试运行我的主要它说:“”main“java.lang.NoClassDefFoundError:Wrapper/java” – Altober 2010-08-18 13:46:56

+1

@Altober:'java'工具期望*类名*,而不是文件名,特别是不是源文件名。你可能需要做一些事情,比如'java wrapers.wrapper',假设你在一个包中有一个类“Wrapper”“Wrapers” – 2010-08-18 13:50:06

8

对于此类任务,您应该使用构建工具(如MavenAnt)。

在初始阶段,当项目不是很复杂,你可以在适当位置使用以下行来编译,用适当的类路径(由@迈克尔的建议):

javac Support/*.java Me/*.java Wrapers/*.java

+0

是的问题是我需要在外部服务器上执行它,我也无法安装任何aditional。 – Altober 2010-08-18 13:39:22

+0

您可以在存储代码的同一文件系统中解压缩ant/maven,不需要“安装”它们,因此这不会妨碍您使用 – 2010-08-18 13:43:19

6
javac -d compiled $(find src -name *.java) 
+0

谢谢我尝试过,但我得到“非法变量名”你知道为什么。谢谢 – Altober 2010-08-18 13:43:07

+0

也许你需要'-sourcepath src'。 (或者你需要指定'src'目录作为类路径的一部分) – 2010-08-18 16:22:10

+0

我试过你的代码片段和我的NetBeans项目,它的工作原理如下: – auraham 2012-09-22 17:41:25

2

如果你真的只是需要使用javac和标准UNIX命令,你可以这样:

find src -name \*.java -print0 | xargs -0 javac -d classes 
0

在许多情况下,蚂蚁是矫枉过正。如果你使用的是windows或shell脚本(sh文件),只要使用BAT文件即可。您可以创建一个包含所有javac命令的文本文件,并在您想构建时运行该文件。

例如,我用下面的bat文件来构建我的应用程序之一:

@echo off 
echo Building Shazaam... 

del classes\com\aepryus\shazaam\*.* /q 
del classes\com\aepryus\shazaam\engine\*.* /q 
del classes\com\aepryus\shazaam\domain\*.* /q 
del classes\com\aepryus\shazaam\persist\*.* /q 
del classes\com\aepryus\shazaam\view\*.* /q 
del classes\com\aepryus\shazaam\task\*.* /q 
del classes\com\aepryus\shazaam\action\*.* /q 
del classes\com\aepryus\shazaam\controller\*.* /q 

javac src\com\aepryus\shazaam\*.java  -classpath \lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar; -d classes 
javac src\com\aepryus\shazaam\engine\*.java -classpath \lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\domain\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\persist\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\view\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\task\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\action\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\controller\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepRPC.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 

cd classes 
jar cf ..\war\WEB-INF\lib\Shazaam.jar . 
cd.. 

echo Complete 
+0

如果你重构一个包或者添加一个新的包,你每次都必须触摸这个文件?有一个http://skillsmatter.com/podcast/java-jee/zen-and-the-art-of-build-script-maintenance的手表,如果你需要说服... – 2010-08-18 13:56:45

+2

不知道别人。但是在项目过程中,我需要修改这样一个批处理文件的次数是微乎其微的。毫无疑问,Maven和Ant是有保证的;但我没有遇到过它们。有时为了杀死一只苍蝇,一把关枪不是必要的(也不是核弹) – aepryus 2010-08-18 14:10:05

0

真正的答案是javac的-d -sourcepath(其中类建立和安装的地方)(来源包的根目录)-cp(依赖关系的类路径,它可以再次成为构建和保存类的类文件夹)Java文件的全限定名称。

实施例的javac -d类-sourcepath SRC -cp类SRC \ COM \测试\ FirstSample.java

的FirstSample.java包含的主要方法。 Pacjage结构如下所述。

之前编译
HomeApp
--src
------ COM \测试\ FirstSample.java(使用FirstPojo.java第一个样品)
------ COM \测试\ FirstPojo.java
--classes

编译
HomeApp
--src 后------ com \ test \ FirstSample.java(FirstSample.java使用FirstPojo。JAVA)
------ COM \测试\ FirstPojo.java
--classes
------ COM \测试\ FirstSample.class(FirstSample.class使用FirstPojo.class)
- ----- com \ test \ FirstPojo.class