【问题标题】:what is correct internal structure of JAR fileJAR 文件的正确内部结构是什么
【发布时间】:2012-04-16 00:31:46
【问题描述】:

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

背景。

我正在使用 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 构建) [属性名称="Main-Class" value="MyPackage.MyMainFile"/]

另外正在开发的包的目录结构如下...

/JavaDev/MyTestPackage/src(包含源文件) //JavaDev/MyTestPackage/bin (包含来自 eclipse 的类文件,或者来自 ANT JAVAC 任务的类文件,我是否将其命名错误?我应该将其命名为 build 吗?)

除此之外,当我创建 jar 时,我没有将其命名为“MyTestPackage.jar”,而只是命名为“test.jar”,这会导致问题吗?我假设我并没有很好地理解 [main-class] 定义的全部内容。

除此之外……

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

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

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

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

我正在为我正在创建的小型“图书馆项目”做这件事,目的是使用 MAVAN 作为将它们连接在一起的主要外包装......但现在我只想让这一切顺利进行因为它的工作原理。

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

提前谢谢...

大卫

【问题讨论】:

  • vikiiii 我打算发表一个狡猾的评论,询问你有多少“眼睛”......但决定不这样做(注意 3“。”不是一个,不是两个)。 ;)

标签: java eclipse ant manifest.mf


【解决方案1】:

当您知道在哪里寻找时,这很简单。假设您的 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 方法。

【讨论】:

  • 好的,那么我如何让 ANT 在 JAR 文件中提供这种类型的结构?还是我从错误的位置运行 ANT? (请记住,我是在 Eclipse 中运行 ANT 任务,而不是 CLI)。以及为什么 ANT 创建另一种类型的目录结构(这是正确的以及如何指定一个或另一个,我在 ANT 文档中还没有找到......但是!
  • wallenborn 目前在我的“编译”中我指向一个 destfile="${class}" 和 class= "build" ,所以这是我的问题所在吗?我要改变它,看看会发生什么......
  • 在编译任务中,无论如何,destfile 可能过于具体。您基本上只想告诉编译任务:获取此 src 目录中的所有内容,递归地编译它,并将生成的类写入该 dest 目录,保留子目录。
  • 好的...我想我到了某个地方。我创建了另一个“hello world”项目,它编译并运行良好。所有编译和构建的东西 JAR 的东西都是一样的(只是文件的位置由于不同的父目录而不同。据我所知,问题是 /build/classes 目录在我的原始项目中没有内容,但在我的“hello World”中...
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 2021-01-04
  • 2016-08-19
  • 2019-12-25
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多