7

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

背景。

我正在使用 Eclipse(在 XP 终端上使用 ANT 插件之一)。

我刚刚开始使用 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 个不同的“正确”内部结构?(如何为每个/控制我得到的东西指定主类和类路径)

另外,如果您有兴趣,请在 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 库复制到指定目录吗?)

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

'Static Final' 问题...我试图在 ANT 中调整类路径,但在连接到 Log4J 和我使用的“包装器”时出现了许多其他错误(因为它是一个错误的导入),但是库存在于它们应该在类路径中设置的位置)。

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

我正在为我正在创建的小型“图书馆项目”这样做,目的是使用 MAVAN 作为将它们连接在一起的主要外包装......但是现在我只想让它继续工作.

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

提前致谢...

大卫

4

1 回答 1

10

当你知道在哪里看时,这很简单。假设您的 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 中,有一个从源编译到目标的编译目标:

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

这样在ant compile您应该在目标中看到类文件之后

target/classes/mypackage/MyMainFile.class

然后有一个 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>

在说ant compile jar你应该在目标中有一个文件 MyJarFile.jar 和

java -jar MyJarFile.jar

应该运行 main 方法。

于 2012-04-02T10:52:51.350 回答