Java JAR清单主类是相对类还是绝对类?
我很难在JAR清单文档中找到确认信息,但我想知道您的入口点是否包含在“./src/java/main/Program.java”(其中./是项目的根目录)中,例如,您的JAR清单文件看起来像这样吗(文件位于根目录中) 如果是这种情况,那么如果您的清单位于某个子目录(如“./lib”)中,它是否仍然与上面的相同,还是其他内容Java JAR清单主类是相对类还是绝对类?,java,Java,我很难在JAR清单文档中找到确认信息,但我想知道您的入口点是否包含在“./src/java/main/Program.java”(其中./是项目的根目录)中,例如,您的JAR清单文件看起来像这样吗(文件位于根目录中) 如果是这种情况,那么如果您的清单位于某个子目录(如“./lib”)中,它是否仍然与上面的相同,还是其他内容 编辑:我的问题与使用Ant从某个给定项目构建JAR文件有关,我们需要在命令中指定找到项目入口点的位置。清单文件的路径是固定的,: 创建JAR文件时,它会自动接收默认清单文件。
编辑:我的问题与使用Ant从某个给定项目构建JAR文件有关,我们需要在命令中指定找到项目入口点的位置。清单文件的路径是固定的,: 创建JAR文件时,它会自动接收默认清单文件。存档中只能有一个清单文件,并且它始终具有路径名
META-INF/MANIFEST.MF
主类的名称始终需要是完全限定的类名。它不能是无条件的,因为它不是一条路径,所以它不能是“相对的”。但它通常对应于JAR中主类文件的绝对资源路径
注释中提到的一个例外是多版本JAR(清单中指定了multi-release:true
)。在这种情况下,其他版本的类资源位于JAR文件中的一个版本化子文件夹中,但清单仍然位于相同的固定位置
还要注意,与您的示例不同,完全限定类名不太可能以src.java.main
开头。相反,它看起来像Java源文件的(乱码)文件夹结构(通常位于src/main/Java
的子文件夹中)。实际的完全限定类名通常应对应于该路径下的文件夹路径(例如,com.your company.project.Main
可能对应于文件src/Main/java/com/your company/project/Main.java
)。它由包的名称加上类的简单名称(用点分隔)给出
例如,在
package me.klmr.project;
class Test { … }
Test
的完全限定类名为me.klmr.project.Test
,与存储Test.java
的路径无关(但是相对于项目根目录,常规路径将是src/main/java/me/klmr/project/Test.java
).我发现我应该指定我是在使用Ant从我的项目中构建JAR文件(在使用命令时)时询问的。对于这个命令,我们需要让Ant知道在哪里可以找到程序的入口点。在某些情况下(例如多版本jar文件),将要执行的实际类可能不会放在简单的/foo/Bar.class
空间中,而是放在类似META-INF/versions/9/foo/Bar.class
的地方,但是清单中给出的名称仍然只是FQCN。@James:入口点总是作为完全限定类名给出。将其映射到某个路径是一项单独的任务。因此,它将始终是(在为我的Ant构建指定的情况下,例如我给出的示例目录)src.java.main.Program
?@James:这极不可能。你们班的套餐
声明是什么?当地人叫什么名字?将这些组合起来,您将得到一些.package.Class。它们位于项目中的src/main/java
就是代码中的组织。该名称仍然不包含这些内容(是的,您可以有一个名为src.main.java
的包,但这是非常不寻常的,如果您这样做,那么这可能是某个地方的错误配置)。完全限定类名是该类的逻辑名称。如何映射到路径(在jar内部或外部)是一个单独的任务,与此无关。这里提供的不是路径,而是名称。(1)Main类既不是相对的,也不是绝对的。它根本不是文件名。它是一个完全限定的类名,包括其包。(2) 清单文件本身只能位于JAR文件中的一个位置:META-INF/Manifest.MF
;它在文件系统中的位置无关紧要。你的问题是基于误解的,我说的是我需要为Ant构建脚本创建的清单文件,以便在创建此类人工制品时通读并理解JAR文件的入口点在哪里。我理解你所说的,一旦创建了JAR文件,清单将存储在唯一可能的目录中,但我已经尝试在编辑我的问题时澄清这不是我所指的。
package me.klmr.project;
class Test { … }