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



这是一个非常愚蠢的问题,我无法给出明确的答案。

背景。

我使用的是Eclipse(带有一个ANT插件,在XP终端上)。

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

META-INF/MANIFEST.MFMyMainFile.class

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

但是当我尝试运行我的文件时,我会遇到"未找到主类"错误?

我看到过一些其他的帖子,人们已经"解压缩"了JAR文件,最后得到了以下结构。。。

META-INF/MANIFEST.MFdtvcontrol/DTVControlApp.class

(从这里http://www.coderanch.com/t/528312/java/java/standalone-application)

因此,我应该得到一个结构,其中我的类文件位于反映包名称的目录中。。。例如

META-INF/MANIFEST.MFMyPackage/MyMainFile.class

如果是这样,为什么我使用ANT得到了不正确的结构,或者为什么有两个不同的"正确"内部结构?(如何为每个类指定主类和类路径/控制我得到的)

如果您感兴趣,也可以在MANIFEST文件状态中(使用ANT构建)[属性name="Main Class"value="MyPackage.MyMainFile"/]

此外,正在开发的包的目录结构如下。。。

/JavaDev/MyTestPackage/src(包含源文件)//JavaDev/MyTestPackage/bin(包含eclipse或ANT JAVAC任务中的类文件,我命名错误了吗?我应该称它为build吗?)

除此之外,当我创建jar时,我并没有将其命名为"MyTestPackage.jar",而是简单地命名为"test.jar",这会导致问题吗?我想我并没有很好地理解这就是[主类]定义的全部内容。

除此之外。。。

"MyTestPackage"实际上是我在其他地方使用的一个小型视觉错误消息传递库,我有第二个文件,它有一个用于测试的主类。因此,它指向各种库(我需要将所有SWT库复制到指定的目录吗?)

我在某个地方读到,如果我将库加载到我的主类中(我这样做显然是为了打开窗口),那么如果我使用它们,尝试在"找不到主类"上运行程序将失败,添加任何"静态最终"成员也是如此(我用它来记录错误)。

"静态决赛"问题。。。我试图调整ANT中的类路径,我在连接Log4J和我使用的"包装器"时遇到了很多其他错误(因为它是一个糟糕的导入),但库存在于类路径中应该设置的位置)。

我觉得我快到了。。。。但不完全。。。

我这样做是为了我正在创建的小型"库项目",目的是将MAVAN用于将它们连接在一起的主外包装。。。不过,现在我只想让它发挥作用。

我可以提供完整的来源,或任何其他需要的信息。

提前感谢。。。

David

当你知道在哪里寻找时,它很简单。说你的META-INF/MANIFEST.MF包含行:

Main-Class: mypackage.MyMainFile

那么罐子的结构需要是

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,将目标设置为target/classes)。然后在ant中,有一个从源到目标进行编译的编译目标:

<target name="compile">
    <mkdir dir="target/classes"/>
    <javac srcdir="src/main/java" destdir="target/classes"/>
</target> 

以便在ant compile之后,您应该在目标中看到类文件

target/classes/mypackage/MyMainFile.class

然后有一个蚂蚁罐任务来包装这个:

<target name="jar" depends="compile">
    <jar destfile="target/MyJarFile.jar" basedir="target/classes">
        <manifest>
            <attribute name="Main-Class" value="mypackage.MyMainFile"/>
        </manifest>
    </jar>
</target>

说了ant compile jar之后,你应该在target和中有一个文件MyJarFile.jar

java -jar MyJarFile.jar

应该运行main方法。

相关内容

  • 没有找到相关文章

最新更新