如何在javac命令中结合JAR包与自定义包编译Java代码
问题排查:javac报错"package PackageName does not exist"
兄弟,我一眼就看到你这里的核心问题了——你对javac的-cp(类路径)参数的用法理解错了!
为什么你的命令会报错?
-cp参数是用来告诉javac去哪里找已经编译好的类文件或者第三方依赖的jar包的,而不是用来指定你要编译的源文件所在的包。你把PackageName加到-cp里,相当于让javac去类路径里找这个包的class文件,但你这是要编译这个包的源文件啊,完全搞反了逻辑!
正确的命令应该怎么写?
先理清楚你的项目目录结构,假设你的项目是这样的(用绝对路径举例子):
/Users/yourname/your-project/ src/ # 源文件根目录 PackageName/ MyClass.java # 你要编译的文件 OtherClassInPackage.java bin/ # 编译后class文件输出目录 lib/ # 第三方jar包存放目录 jar1.jar jar2.jar ... jarN.jar
情况1:在项目根目录执行命令
你需要用-sourcepath指定源文件的根目录(也就是src),同时-cp只放依赖的jar包:
javac -d /Users/yourname/your-project/bin \ -cp /Users/yourname/your-project/lib/jar1.jar:/Users/yourname/your-project/lib/jar2.jar:...:/Users/yourname/your-project/lib/jarN.jar \ -sourcepath /Users/yourname/your-project/src \ /Users/yourname/your-project/src/PackageName/MyClass.java
情况2:在src目录下执行命令
更简单,直接指定源文件的相对路径,-cp指向lib目录的jar包:
javac -d ../bin \ -cp ../lib/jar1.jar:../lib/jar2.jar:...:../lib/jarN.jar \ PackageName/MyClass.java
额外需要检查的几个坑
- 大小写问题:Mac文件系统默认大小写不敏感,但Java是严格大小写敏感的!比如你的源文件里的包声明是
package packagename;,但你命令里写的是PackageName,就会报错。 - 包声明和目录匹配:确认
MyClass.java的第一行是package PackageName;,并且这个文件确实放在名为PackageName的文件夹里(目录名和包名必须完全一致)。 - 不要把源目录加到-cp里:类路径只放依赖的jar或者已经编译好的class文件目录(比如
bin,如果有其他已经编译好的类需要依赖)。
如果还是不行,你可以试试直接编译包内所有文件,比如在src目录下执行:
javac -d ../bin -cp ../lib/*.jar PackageName/*.java
(*.jar可以批量匹配lib下的所有jar包,Mac上bash支持这个写法)
内容的提问来源于stack exchange,提问作者spectrum
相关产品推荐
相关产品推荐

