Java编译器003---javac -d/-sourcepath/-classpath选项

Posted 光头用沙宣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java编译器003---javac -d/-sourcepath/-classpath选项相关的知识,希望对你有一定的参考价值。

简介:

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依赖外,无其他依赖;如果同时找到了源文件和字节码文件,两者一致,以字节码文件为准;不一致,以源文件为准,并编译源文件

以上是关于Java编译器003---javac -d/-sourcepath/-classpath选项的主要内容,如果未能解决你的问题,请参考以下文章

java编译器和java虚拟机的关系??

java编译器与java运行器版本一致性问题

请教高手教我如何配置java编译器

JAVA的编译器都有哪些?

java 编译优化问题

IntelliJ IDEA告诉我“错误:java:编译失败:内部java编译器错误想法”