什么是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方法。