这是一个非常愚蠢的问题,我无法回答这个问题。
背景
我正在使用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个不同的'正确'内部结构? (如何为每个/控制我得到的东西指定主类和类路径)
如果您有兴趣,请在MANIFEST文件中说明(使用ANT构建) [attribute name =“Main-Class”value =“MyPackage.MyMainFile”/]
正在开发的软件包的目录结构如下......
/ JavaDev / MyTestPackage / src(包含源文件) // JavaDev / MyTestPackage / bin(包含来自eclipse或来自ANT JAVAC任务的类文件,我是否将其命名为错误?我应该将其称为构建吗?)
除此之外,当我创建jar时,我没有将其命名为'MyTestPackage.jar',但只是'test.jar'可能导致问题?我并不认为我已经很好地理解了[主要类]定义的内容。
除此之外......
'MyTestPackage'实际上是一个我在别处使用的小型可视化错误消息库,我有一个第二个文件,它有一个用于测试的主类。因此它指向各种库(我是否需要将所有SWT库复制到指定目录?)
我已经读过某个地方,如果我将库加载到我的主类(我明显打开窗口),那么如果我使用它们,尝试运行程序将失败'未找到主类',同样也是适用于添加任何“静态最终”成员(我用于错误的登录)。
'静态决赛'问题...... 我试图调整ANT中的类路径,并且我得到了一些其他错误,用于连接到我使用的Log4J和我的'包装器'(这是一个糟糕的导入),但库存在应该设置的地方在类路径中。)
我觉得我几乎就在那里......但不完全......
我正在为我正在创建的小型“图书馆项目”这样做,目的是将MAVAN用于主要的外部包,将它们连接在一起......但是现在我只是希望这样做因为它有效。
我可以根据需要提供完整的来源或任何其他信息。
提前致谢...
大卫
答案 0 :(得分:8)
当你知道在哪里看时,这很简单。假设您的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方法。