• 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在cmd中编译运行
    Java基础学习 —— 对象的克隆
    将博客搬至CSDN
    jenkins节点管理中没有默认没有Launch agent via Java Web Start
    postman 集成ci
    postman初级使用
    jmeter分布式压测实践及踩坑记录(linux压力机)
    jmeter监控服务器cpu、内存等
    jmeter跨线程组传递token实践
    初识jmeter
  • 原文地址:https://www.cnblogs.com/sniffs/p/12654275.html
Copyright © 2020-2023  润新知