什么是JAR文件的正确内部结构
这是一个非常愚蠢的问题,我无法回答这个问题。
背景。
我正在使用Eclipse(带有一个ANT插件,在XP终端上)。
我刚刚开始玩ANT,在[jar]指令中我设置完成的JAR文件的位置,当我’解压缩’文件时我得到以下内容
META-INF / MANIFEST.MF MyMainFile.class
这与oracle网站上的内部结构一致。 (这里http://docs.oracle.com/javase/tutorial/deployment/jar/view.html )
但是当我尝试运行我的文件时,我收到了“找不到主类”的错误?
我已经看到其他一些post,人们已经“解压缩”了JAR文件并最终得到了以下结构……
META-INF / MANIFEST.MF dtvcontrol / DTVControlApp.class
(从这里http://www.coderanch.com/t/528312/java/java/standalone-application )
所以我应该得到一个结构,其中我的类文件位于反映包名称的目录中…例如
META-INF / MANIFEST.MF MyPackage / MyMainFile.class
如果是这样,为什么我使用ANT得到错误的结构,或者为什么有2个不同的“正确”内部结构? (如何为每个/控制我得到的东西指定main-class和classpath)
如果您感兴趣,请在MANIFEST文件中声明(使用ANT构建)[attribute name =“Main-Class”value =“MyPackage.MyMainFile”/]
正在开发的包的目录结构如下……
/ JavaDev / MyTestPackage / src(包含源文件)// JavaDev / MyTestPackage / bin(包含来自eclipse的类文件,或来自ANT JAVAC任务,我是否将其命名为错误?我应该将其命名为build吗?)
除此之外,当我创建jar时,我没有将其命名为’MyTestPackage.jar’,但只是’test.jar’可能导致问题? 我并不认为我已经很好地理解了[main-class]定义的内容是什么。
除此之外……
‘MyTestPackage’实际上是我在别处使用的一个小的可视化错误消息库,我有一个第二个文件,它有一个用于测试的主类。 因此它指向各种库(我需要将所有SWT库复制到指定目录吗?)
我已经读过某个地方,如果我将库加载到我的主类(我显然是打开窗口),那么如果我使用它们,尝试运行程序将失败’未找到主类’,添加也是如此在任何’静态最终’成员(我用于错误的登录)。
“静态最终”问题……我试图在ANT中调整类路径,并且我得到了一些其他错误,用于连接到我使用的Log4J和我的’包装器’(与它有关的是一个糟糕的导入),但是库存在应该在类路径中设置的位置)。
我觉得我差不多……但不是很……
我正在为我正在创建的小型“图书馆项目”这样做,目的是将MAVAN用于主要的外部包,将它们连接在一起……但是现在我只是希望这样做,因为它的工作原理。
我可以根据需要提供完整的来源或任何其他信息。
提前致谢…
大卫
当你知道在哪里看时,这很简单。 假设您的META-INF / MANIFEST.MF包含以下行:
Main-Class: mypackage.MyMainFile
然后jar的结构需要
META-INF/MANIFEST.MF mypackage/MyMainFile.class
MyMainFile必须在适当的包中:
package mypackage; public class MyMainFile { public static void main(String[] args) { ...
您的错误消息是由MyMainFile在错误的位置引起的。
编辑:自从我最后一次使用ant以来已经有一段时间了,但我认为你需要这样的东西:反映包装结构的源文件结构,比如说
src/main/java/mypackage/MyMainFile.java
以及将编译后的类文件放入的目录
target
(我在这里使用maven约定,ant并不关心你可以使用eclipse中的(右键单击) – > properties-> Java Build path-> Sources选项卡将源目录设置为src / main / java和目标目标/类)。 然后在ant中,有一个从源到目标编译的编译目标:
所以在ant compile
你应该在目标中看到类文件
target/classes/mypackage/MyMainFile.class
然后有一个ant jar任务打包这个:
在说ant compile jar
你应该在目标和文件中有一个文件MyJarFile.jar
java -jar MyJarFile.jar
应该运行main方法。