javac编译采坑
2022-04-25 本文已影响0人
后知不觉1
背景
目录结构如图

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类失败而无法编译
输出见下图

解决办法
javac -cp 参数指定类的搜索目录即可,这里也说明javac编译时不会去校验包路径,查找其他类时会按照包路径查询
javac -cp ./ com/tianzehao/App.java #
思考
- java的classpath分为两部分,全局、临时指定
全局是暴露$CLASSPATH变量,临时通过-cp指定。 - javac -bootclasspath原以为是指定bootstarp Classloader的位置,经测试不是的,相当于指定java的安装目录,用于多版本
- javac编译是将入口类里一整条链路的类都编译,多个入口类(没有调用关系的类)编译需要多次执行,这就比麻烦,因此有了maven这种编译工具。这点是比webpack灵活的