简介:
javac -help回显中能够看到-d、-sourcepath、-classpath的简介:
-d <目录> 指定放置生成的类文件的位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置,同-cp选项
-sourcepath <路径> 指定查找输入源文件的位置
单纯查看这些简介可能很懵,这几个编译选项到底是做什么用的?该怎么使用?下面结合应用说明这几个编译选项的用法。
源码:
1、目录结构
2、依赖关系
Person.java依赖三方库lombok、MyService.java依赖Person.java和MyController.java
3、源码
Person.java
package bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder(toBuilder = true)
public class Person {
private int id;
private String name;
}
MyController.java
package controller;
public class MyController {
public void func() {
System.out.println("My controller");
}
}
MyService.java
package service;
import bean.Person;
import controller.MyController;
public class MyService {
public static void main(String[] args) {
Person person = Person.builder().id(1).name("AAAA").build();
System.out.println(person);
MyController controller = new MyController();
controller.func();
}
}
编译MyController.java
MyController.java除依赖JDK lib外,无任何外部依赖,并且windows上定义了环境变量CLASSPATH,因此直接编译即可,编译命令为:
javac src/main/java/controller/MyController.java
编译Person.java
Person.java外部依赖为三方件lombok,编译时需要指定classpath为lombok jar包所在路径,编译命令为:
javac -classpath lib/lombok-1.18.12.jar src/main/java/bean/Person.java
编译MyService.java
MyService.java依赖Person.java和MyController.java,并且这三个类不在同一个包下,尝试编译步骤如下:
1、直接编译:javac src/main/java/service/MyService.java,毫无疑问,编译报错,报找不到Person.java和MyController.java符号定义;
2、通过-classpath参数,指导编译器到指定路径下去查找依赖。由于Person.java和MyController.java在不同的包下,因此需要将Person.java和MyController.java
编译后的字节码文件输出到统一路径:output。这个功能可以用-d选项来实现,编译命令为:
javac -d output/ -classpath lib/lombok-1.18.12.jar src/main/java/bean/Person.java
javac -d output/ src/main/java/controller/MyController.java
javac -d output/ -classpath output/ src/main/java/service/MyService.java
执行如上编译命令后,output目录下生成对应的字节码文件如下:
运行MyService.class,可以正常输出;注意:这里需要切换目录到output,然后执行java service/MyService,这是因为MyService.java的包名为service,运行结果:
3、也可以通过-sourcepath选项指定依赖类的位置,这里注意:由于Person.java依赖了三方件lombok,Person.java不能通过-sourcepath选项编译。
此时编译命令为:
javac -d output/ -classpath lib/lombok-1.18.12.jar src/main/java/bean/Person.java
javac -d output/ -sourcepath src/main/java/ -classpath output/ src/main/java/service/MyService.java
总结:
-d选项: 指定编译生成字节码文件路径,如果源文件有包名,字节码文件路径包含包名
-classpath选项: 指定依赖类路径,这里的依赖类为字节码文件;用于指导编译器在编译时按照指定路径查找依赖类;可以指定多个classpath,linux用:分隔,windows用;分隔
-sourcepath选项: 指定依赖类源文件路径,并且要求源文件除CLASSPATH依赖外,无其他依赖;如果同时找到了源文件和字节码文件,两者一致,以字节码文件为准;不一致,以源文件为准,并编译源文件