【发布时间】:2019-09-02 08:11:39
【问题描述】:
在编译多个.java文件时,它们之间有一些依赖关系,我们需要按某种顺序编译它们吗?
依赖项必须是 .class 文件吗?或者依赖项可以是 .java 文件吗?
具体来说,当A.java依赖于从B.java文件编译的B.class文件,但是B.class还没有被创建(即B.java文件还没有被编译成B.class),我们能不能通过在java -cp 中指定B.java 的目录来编译A.java?还是我们需要先将B.java编译成B.class,然后在编译A.java的时候在java -cp中指定B.class的目录?
例如,从https://dzone.com/articles/java-8-how-to-create-executable-fatjar-without-ide,./src/main/java/com/exec/one/Main.java 依赖于./src/main/java/com/exec/one/service/MagicService.java,两者都还没有被编译。
为什么下面的编译会失败?
$ javac ./src/main/java/com/exec/one/*.java -d ./out/
./src/main/java/com/exec/one/Main.java:3: error: package com.exec.one.service does not exist
import com.exec.one.service.MagicService;
^
./src/main/java/com/exec/one/Main.java:8: error: cannot find symbol
MagicService service = new MagicService();
^
symbol: class MagicService
location: class Main
./src/main/java/com/exec/one/Main.java:8: error: cannot find symbol
MagicService service = new MagicService();
^
symbol: class MagicService
location: class Main
3 errors
为什么下面的编译会成功?如何在一个javac 命令中编译它们? -cp ./src/main/java在编译中是如何使用的?编译过程会发生什么?
$ javac -cp ./src/main/java ./src/main/java/com/exec/one/*.java ./src/main/java/com/exec/one/**/*.java
./src/main/java/com/exec/one/Main.java
package com.exec.one;
import com.exec.one.service.MagicService;
public class Main {
public static void main(String[] args){
System.out.println("Main Class Start");
MagicService service = new MagicService();
System.out.println("MESSAGE : " + service.getMessage());
}
}
./src/main/java/com/exec/one/service/MagicService.java
package com.exec.one.service;
public class MagicService {
private final String message;
public MagicService(){
this.message = "Magic Message";
}
public String getMessage(){
return message;
}
}
【问题讨论】:
-
这是一个 maven 项目吗?
-
@ThorbjørnRavnAndersen 不是。