Docker环境下Java跨包调用编译失败问题求助
问题原因与解决方法
核心问题
你手动用javac编译时没指定类路径(classpath)——Eclipse会自动帮你处理类路径依赖,但命令行编译必须显式声明,不然javac找不到其他包的类。
修正后的Dockerfile
把原Dockerfile里的编译和运行命令替换成下面的内容:
# 创建编译输出目录 RUN mkdir -p bin # 编译main包的Operations类,指定输出到bin目录 RUN javac -d bin src/javafactorielle/main/Operations.java # 编译test包的Main类,把bin目录加入类路径,同时输出到bin目录 RUN javac -cp bin -d bin src/javafactorielle/test/Main.java # 运行时指定类路径为bin,调用完整类名(因为类在test包下) CMD ["java", "-cp", "bin", "javafactorielle.test.Main", "4"]
关键参数说明
-d bin:指定编译后的class文件输出到bin目录,javac会自动根据包结构创建对应的子目录(比如bin/javafactorielle/main/和bin/javafactorielle/test/)。-cp bin:告诉javac和java命令,要从bin目录里找依赖的类文件。- 运行时必须用完整类名
javafactorielle.test.Main,因为你的Main类属于javafactorielle.test包,不能只写Main。
关于Docker Compose
完全不需要用Docker Compose。它是用来管理多容器应用的(比如同时跑Java服务和数据库),你这是单容器内的Java编译运行问题,和多容器无关。
内容的提问来源于stack exchange,提问作者Erwan Maigne Montamat
相关产品推荐
相关产品推荐

