在Java中使用命令行编译多个包

14

你好,我一直在使用集成开发环境 (IDE),但现在我需要从命令行运行和编译代码。

问题是我有多个包,我已经尝试了很多方法,但都没有成功。

所以我现在遇到了困难。

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

你知道如何使用javac编译所有内容吗?

8个回答

12

这应该可以解决问题(可能需要通过-cp命令行开关添加额外的classpath元素):

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

但是如果您的构建过程变得更加复杂(这是肯定会发生的!),您应该考虑使用Apache Ant进行构建自动化。


2
+1 - 对于一个具有最小外部依赖的现有项目而言,Ant比(例如)Maven更简单。他的IDE甚至可以生成初始的“build.xml”文件。 - Stephen C
谢谢,我尝试了这个,它编译了所有内容,但没有生成类结构,所以当我尝试运行我的主程序时,它会显示“main”java.lang.NoClassDefFoundError: Wrapper/java。 - Altober
1
@Altober:java 工具期望的是 类名,而不是文件名,尤其不是源文件名。你可能需要执行类似 java Wrapers.Wrapper 的操作,假设你有一个名为 "Wrapper" 的类在 "Wrapers" 包中。 - Michael Borgwardt

10

对于这样的任务,您应该使用构建工具,例如MavenAnt

在项目不是非常复杂的初始阶段,您可以使用以下命令进行编译,并放置适当的类路径(如@Michael所建议的):

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


1
是的,问题在于我需要在外部服务器上完成它,而我无法安装任何额外的工具。 - Altober
你可以将Ant/Maven解压缩到存储代码的同一文件系统中,不需要“安装”它们,因此这不会阻止你使用任何一个。 - Jon Freedman

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

谢谢,我尝试了,但是出现了“非法变量名”的错误,你知道为什么吗?谢谢。 - Altober
也许你还需要加上 -sourcepath src。或者你需要将 src 目录作为类路径的一部分来指定。 - Ken Bloom
我已经在我的NetBeans项目中尝试了您的代码片段,它可以正常工作: - auraham

2
真正的答案是 javac -d(指定编译后类文件的存放目录)-sourcepath(指定源代码包的根目录)-cp(指定依赖项的classpath,这些依赖项可以是类文件夹,其中类已经被构建和保留)Java文件的完全限定名称。
例如 javac -d classes -sourcepath src -cp classes src\com\test\FirstSample.java
FirstSample.java 包含 main 方法。如下所示,Pacjage 结构。
编译前 HomeApp --src ------com\test\FirstSample.java (使用 FirstPojo.java 的第一个示例) ------com\test\FirstPojo.java --classes
编译后 HomeApp --src ------com\test\FirstSample.java (使用 FirstPojo.java 的第一个示例) ------com\test\FirstPojo.java --classes ------com\test\FirstSample.class (使用 FirstPojo.class 的 FirstSample.class) ------com\test\FirstPojo.class

2
如果您确实需要仅使用javac和标准UNIX命令,您可以这样做:
find src -name \*.java -print0 | xargs -0 javac -d classes

1
  1. 编译运行以下命令[它将把所有的类文件存储在classes文件夹中]

    javac -d classes Support/*.java Me/*.java Wrapers/*.java

**注意:应先创建classes文件夹

  1. 要运行Java应用程序,请运行以下命令

    java -cp classes {mainfile_name}

将mainfile_name替换为您的主文件。


0
要将Java程序编译为一个完整的包,您应该在包所在的位置执行以下命令(即您当前的位置应该有您要编译的文件夹)。
javac -d /*.java

是您编译后的类文件存储的位置 是包名或其路径

<package_name>/*.java

你可以一次添加多个包,使用这个语法,用空格分隔。

1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到更多关于如何撰写好回答的信息。 - undefined

0
在许多情况下,Ant 是过度设计了。如果你在 Windows 上,只需使用 BAT 文件;如果你在 Linux 上,则使用 shell 脚本(sh 文件)。你可以创建一个文本文件,其中包含所有的 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

如果你重构一个包或添加一个新的包,每次都必须修改这个文件怎么办? 如果需要说服,请观看http://skillsmatter.com/podcast/java-jee/zen-and-the-art-of-build-script-maintenance。 - Jon Freedman
2
我不知道别人的情况。但在项目过程中,我需要修改这样一个批处理文件的次数微乎其微,甚至根本不需要修改。毫无疑问,Maven和Ant是有必要的情况;但我还没有遇到过这种情况。有时候为了杀一只苍蝇,用散弹枪或核武器都不必要。 - aepryus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接