首页 > 编程知识 正文

javac编译整个项目,执行java程序的编译命令是什么

时间:2023-05-06 09:46:06 阅读:185641 作者:4515

虽然我们平时大量使用IDE工具,但是我们可能甚至不知道这个基本命令是如何使用的。 今天使用这个命令编译java项目。

1 .编译Java项目首先要有一个Java项目

上面的项目是我在eclipse上创建的普通项目。 eclipse编译java项目后,将生成的class文件放在传统的山水目录中。 然后,lib目录是我们自己创建的,在使用javac编译项目时,必须手动指定jar包的位置

我们项目的源文件放在src上。 我们现在正在使用javac命令手动编译这个项目。 同样,也可以指定将class文件输出到传统山水目录下。 使用javac的时候附上对应的参数就可以了。

我们先简单地试一下。 以前使用javac的时候是编译的文件,这次是编译项目。 我不知道该从哪里着手。

编译. java文件时,javac命令找到了未知的类。 可以是该类的class文件。 如果相关联的class类不存在,请找到并编译相应的java文件。 是不是意味着编译包含main函数的文件就可以编译所有的. java文件? 我试试看。

以下分别是core和utils包下的java文件: 让我们编译一下。 BootStrap是门户文件。

如果在-encoding中指定文件编码,编译器将使用该编码读取jar文件

-cp指定类路径。 如果未指定,则缺省值为当前正在运行javac命令的文件夹。 编译器在搜索与某个类相关的类时会根据CLASSPATH进行搜索。 例如,如果在一个类文件中导入另一个包的java文件,javac将根据CLASSPATH搜索该java文件。 如果编译的java文件在中具有关联的其他类,javac将首先查看import是否导入了该类。 如果未导入,则它与当前类位于同一包下。 在这种情况下,javac也可以正常编译。 javac将使用路径: CLASSPATH当前编译的类的软件包路径来搜索类。 例如,你现在正在编译comwebA.java文件。 而且,a的类与另一个b类相关联。 A.java不需要使用import关键字导入,因为b类与a位于同一个包下。 因此,javac将使用CLASSPATH路径a中的软件包路径来查找和编译b类。 如果未设置CLASSPATH,则缺省情况下将运行javac命令。)

-请注意CP后面的写法。lib*;“; 中选择另一种天花板类型。 CLASSPATH可以是多个,因此.lib*是我用来加载所有jar包的路径,"."是指当前路径。 这样可以找到所有已正确编译并依赖于它的. java和. class文件。

注意:在指定编译路径时,对于jar包必须要指定全路径即路径+文件名的格式,不能只指定一个路径,所以我们上面加载jar包的路径使用了“*”进行通配,而不能只指定文件夹。

但是,编译的. class和java文件位于同一路径中,因此必须使用-d参数来设置类文件的输出目录

最终,所有编译的class文件将显示在传统山水目录下

使用javac编译项目时,通常只需指定包含main方法的类,而不需要像c语言那样在每个. c文件中指定

例如,当前有三个java文件位于同一个包中。

T.java文件

public classt { publicstaticvoidmain (string [ ] args ) { A a=new A ); }} A.java文件

公共类a { b b }; } B.java文件

在公共类b { }中,编译项目的命令如下

javac T.java只需要指定main方法所在的java文件。 然后,javac将在编译过程中查找每个关联java文件的每个元件,并最终编译整个项目的java文件。

例如,上面的:编译T.java时,如果内部有a,则javac会委托a编译,而编译a时会发现需要b,然后委托b编译。

java命令执行项目当前存在java项目,项目下存在package或文件夹

包含主函数的class位于此文件下,因此运行class时必须位于当前chaoxing所在的文件夹下。 包含main函数的类所属的package是chaoxing,因此如果直接在包含class文件的路径上运行,则找不到或无法加载主类

命令如下所示

javachaoxing.main http://www.Sina.com /

题,java命令找寻一个类使用的是CLASSPATH+package作为class的路径,javac找寻一个java文件是根据CLASSPATH+import来找寻一个.java文件或者是一个已经存在的.class文件

 

java命令行执行程序解决依赖外部jar包的问题

用java命令行直接执行程序,如果这个程序需要引用外部jar包。就不能单纯用java xx来执行

如果你的jar包和程序就在一个目录:

编译

javac -cp yy/yy.jar,xx/xx.jar test.java

执行

java -cp yy/yy.jar,xx/xx.jar test

注意:-cp会覆盖我们在系统上设置的环境变量

但是往往我们依赖的包很多,要一个个填写估计就疯了。所有我们一般会把所有的外部依赖包都放在一个文件夹里,比如在./lib

编译 

javac -Djava.ext.dirs=./lib test.java

执行

java  -Djava.ext.dirs=./lib test

-Djava.ext.dirs是设置的ExtClassLoader加载器的加载路径,且ExtClassLoader加载器只能加载jar包,不能加载.class文件

但是这并不是说AppClassLoader类加载器只能加载.class文件,其也能加载jar文件,我们上面一个一个指定jar包的方式,那么该jar包就会由AppClassLoader类加载器加载

注意:-Djava.ext.dirs=./lib 覆盖java本身设置的java.ext.dirs属性,java默认情况下该值为$JAVA_HOME/lib/ext。

java.ext.dirs指定的目录由ExtClassLoader加载器加载。我们覆盖了默认的属性之后就会导致我们会失去一些功能,例如java自带的加密算法。

所以,我们设置的时候需要带上原来的默认情况下的属性值,这样就不会出现问题了

-Djava.ext.dirs=.:$JAVA_HOME/jre/lib/ext

 

javac和java -cp参数的区别

javac -cp 指明了.java文件里import的类的位置,也就是编译时检查对应的类存不存在,不存在编译就不能通过。

java -cp 指明了去哪些文件夹下寻找运行时需要加载的class文件,既指定系统类加载器的类加载目录。假如我们现在执行java命令所在的文件夹不是我们要执行的class所在的文件夹,就需要通过该参数来指定对应的目录,这样才能执行成功。同时java后面指定要执行的class的时候,不能使用绝对路径,只能使用其所在包的名称。

假设我们现在有个Test.class文件在C:/user/11/desktop/com/c文件夹下,com.c既是他的报名

# 这种方式来执行该class是错的,因为java后面写要执行的class文件写的应该是其所在包的名称,而不是路径。java C:/user/11/desktop/com/c/Test# 应该像这样,但是这样要求我们的 C:/user/11/desktop路径在环境变量classpath中,这样java命令才能找到该类,否者是找不到的,因为java命令执行class文件就是根据 classpath+类的全限定名来确定类所在位置java com.c.Test# 如果不想把路径放到classpath中,因为我们有时候可能只是临时执行,就可以使用-cp参数来指定classpath,且其优先级比环境变量中的高java -cp C:/user/11/desktop com.c.Test# 使用该参数之后,不管我们在哪个路径下执行该class文件,都会成功

一般我们在class包所在文件夹中执行class文件时不用使用-cp参数,这是大多数都在classpath中设置了 "."这个路径来指定当前路径就是其中一个类加载路径。

 

如果我们编译的一个工程中,有多个相同的类文件(全限定名相同),那么javac会去编译哪一个.java文件呢?

当然这种情况肯定要指定多个classpath,同一个classpath下操作系统不会允许有同名文件,就是在多个文件下有相同的.java文件的请情况下,javac命令会编译最先找到的那一个,因为javac命令本身就是按照顺序一个路径一个路径的找,所以其会编译最先找到的一个。如果是java命令也是一样的,其会加载最先找到的那个class.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。