Java 类路径和Ant构建
下面的ant compile目标编译使用Java 类路径和Ant构建,java,ant,Java,Ant,下面的ant compile目标编译使用标记指定的任何src文件夹中的所有.java文件。您可以看到使用标记将许多项添加到类路径中 <target name="compile"> <echo message="${ant.project.name}: ${ant.file}"/> <deps-load-path conf="core" pathid="core.ivy.classpath" /> <d
标记指定的任何src文件夹中的所有.java文件。您可以看到使用
标记将许多项添加到类路径中
<target name="compile">
<echo message="${ant.project.name}: ${ant.file}"/>
<deps-load-path conf="core" pathid="core.ivy.classpath" />
<deps-load-path conf="test" pathid="test.ivy.classpath" />
<javac debug="true" includeantruntime="false" debuglevel="source,lines,vars" destdir="${bin.path}" source="1.8" target="1.8">
<src path="${xtext.project.path}/src"/>
<src path="${xtext.project.path}/src-gen"/>
<src path="${project.path}/src"/>
<src path="${project.path}/src-gen-umpletl"/>
<src path="${project.path}/src-gen-umple"/>
<src path="${project.path}/test"/>
<src path="${vendors.path}/jopt-simple/src"/>
<exclude name="**/.git"/>
<exclude name="**/*.ump" />
<exclude name="**/data" />
<classpath refid="project.classpath"/>
<classpath refid="validator.project.classpath"/>
<classpath refid="core.ivy.classpath" />
<classpath refid="test.ivy.classpath" />
<!-- Add compiler arguments here, see https://ant.apache.org/manual/using.html#arg for details, example below
<compilerarg value="-Xlint:deprecation" />
-->
</javac>
<copy todir="${bin.path}" overwrite="true">
<fileset dir="${project.path}/src"><include name="**/*.grammar"/></fileset>
<fileset dir="${project.path}/src"><include name="**/*.error"/></fileset>
</copy>
<delete file="cruise.umple/src/rules.grammar"/>
<delete file="cruise.umple/bin/rules.grammar"/>
</target>
其中一项是project.classpath
,它在文件的其他地方定义为与编译文件写入到的${bin.path}
位置相同的位置(请参见
标记)。${bin.path}
如何既是类路径依赖项又是写入.class
文件的位置?我知道,${bin.path}
在每次构建之前都会被删除,因此在运行编译目标之前,文件夹中没有任何内容。编译目标执行时生成的.class
文件是否动态添加到类路径中?类文件将写入destdir,如果类路径中包含相同的目录,则无关紧要。类路径用于创建类文件,以提供源.java文件中可能缺少的任何类。因此,destdir
位于类路径上,并且随着编译的进行,destdir
将填充.class
文件。这是否意味着classpath
正在动态变化(即destir
中填充了.class
文件)?不过,这似乎是一种奇怪的方式。如果A.java
需要B.java
,我们去编译A.java
,而B.java
还没有编译,会发生什么?编译器是否会跳过A.java
,然后在编译B.java
并将B.class
放入destdir
后,返回到A.java
?这似乎是一场依赖性噩梦。这不再是一个蚂蚁问题,而是关于Java编译器如何工作的问题。让我们先来看一个简单的场景。如果编译中的java文件只引用了其他java文件中的类,那么就不需要类路径,对吗?所有课程都将在本地提供。类路径用于链接到源代码外部的类,通常在第三方jar文件中。管理这些jar文件是真正的依赖关系管理挑战。因此,在Java构建工具(如Maven和GradleOk)中需要像ivy这样的ANT插件来模拟功能,如果我分别编译
元素中包含的每个文件夹会怎么样?我是否需要将包含其他文件夹中的.class
文件的文件夹放在类路径
上,以便正确编译(因为其他文件夹将被视为编译文件夹中java文件的外部文件夹)?规则是“如果在当前编译的文件夹之外引用带有.class
文件的java类,则必须将包含外部类的文件添加到类路径”吗?