美文网首页
javac编译采坑

javac编译采坑

作者: 后知不觉1 | 来源:发表于2022-04-25 20:30 被阅读0次

背景

目录结构如图


image.png
package com.tianzehao;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

#在src/main/java中编译App.java 没有问题 javac com/tianzehao/App.java

如果App类中有引用就无法编译成功

package com.tianzehao;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        Test.sayName();
    }
}


 #报错如下
com/tianzehao/App.java:12: error: cannot find symbol
        Test.sayName();
        ^
  symbol:   variable Test
  location: class App
1 error

是因为javac 编译时默认查找路径为$CLASSPATH(linux服务器),而该变量中没有该路径/data1/tianzehao/java/maven_demo/src/main/java导致查找Test类失败而无法编译
输出见下图

image.png

解决办法

javac -cp 参数指定类的搜索目录即可,这里也说明javac编译时不会去校验包路径,查找其他类时会按照包路径查询

 javac -cp ./ com/tianzehao/App.java #

思考

  • java的classpath分为两部分,全局、临时指定
    全局是暴露$CLASSPATH变量,临时通过-cp指定。
  • javac -bootclasspath原以为是指定bootstarp Classloader的位置,经测试不是的,相当于指定java的安装目录,用于多版本
  • javac编译是将入口类里一整条链路的类都编译,多个入口类(没有调用关系的类)编译需要多次执行,这就比麻烦,因此有了maven这种编译工具。这点是比webpack灵活的

相关文章

网友评论

      本文标题:javac编译采坑

      本文链接:https://www.haomeiwen.com/subject/wqexyrtx.html