这是一个非常愚蠢的问题,我无法给出明确的答案。
背景。
我使用的是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方法。