什么是JAR文件的正确内部结构

Dav*_*veM 6 java eclipse ant manifest.mf

这是一个非常愚蠢的问题,我无法回答这个问题.

背景.

我正在使用Eclipse(带有一个ANT插件,在XP终端上).

我刚刚开始玩ANT,在[jar]指令中我正在设置完成的JAR文件的位置,当我'解压缩'文件时,我得到以下内容

META-INF/MANIFEST.MF MyMainFile.class

这与oracle网站上的内部结构一致.(这里http://docs.oracle.com/javase/tutorial/deployment/jar/view.html)

但是当我尝试运行我的文件时,我得到一个'主要类未找到'错误?

我看过其他一些帖子,其中人们已经"解压缩"了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用于主要的外部包,将它们连接在一起......但是现在我只是希望这样做,因为它的工作原理.

我可以根据需要提供完整的来源或任何其他信息.

提前致谢...

大卫

wal*_*orn 9

当你知道在哪里看时,它很简单.假设您的META-INF/MANIFEST.MF包含以下行:

Main-Class: mypackage.MyMainFile
Run Code Online (Sandbox Code Playgroud)

然后jar的结构需要

META-INF/MANIFEST.MF
mypackage/MyMainFile.class
Run Code Online (Sandbox Code Playgroud)

MyMainFile必须在适当的包中:

package mypackage;
public class MyMainFile {
  public static void main(String[] args) {
...
Run Code Online (Sandbox Code Playgroud)

您的错误消息是由MyMainFile在错误的位置引起的.

编辑:自从我最后一次使用ant以来已经有一段时间了,但我认为你需要这样的东西:反映包装结构的源文件结构,比如说

src/main/java/mypackage/MyMainFile.java
Run Code Online (Sandbox Code Playgroud)

以及将编译后的类文件放入的目录

target
Run Code Online (Sandbox Code Playgroud)

(我在这里使用maven约定,ant并不关心你可以使用eclipse中的(右键单击) - > properties-> Java Build path-> Sources选项卡将源目录设置为src/main/java和目标目标/类).然后在ant中,有一个从源到目标编译的编译目标:

<target name="compile">
    <mkdir dir="target/classes"/>
    <javac srcdir="src/main/java" destdir="target/classes"/>
</target> 
Run Code Online (Sandbox Code Playgroud)

这样ant compile你应该在目标中看到类文件

target/classes/mypackage/MyMainFile.class
Run Code Online (Sandbox Code Playgroud)

然后有一个ant jar任务打包这个:

<target name="jar" depends="compile">
    <jar destfile="target/MyJarFile.jar" basedir="target/classes">
        <manifest>
            <attribute name="Main-Class" value="mypackage.MyMainFile"/>
        </manifest>
    </jar>
</target>
Run Code Online (Sandbox Code Playgroud)

在说ant compile jar你应该在目标内部有一个文件MyJarFile.jar之后

java -jar MyJarFile.jar
Run Code Online (Sandbox Code Playgroud)

应该运行main方法.