创建可执行的JAR文件

3

我写了一个程序:

public class SystemShutdown {
    public static void main(String[] args) {
        try{
            for(int i=0;i<10;i++){
                Thread.sleep(1000);
            }
            Process p=Runtime.getRuntime().exec("shutdown -s -t 2700");
        }catch(Exception e){}
    }
}

我已经编译并保留了.class文件。

现在,我将写一个清单文件如下:

Manifest-Version: 1.0
Main-Class: SystemShutdown

并保存为 MANIFEST.MF

我会把两个文件 (.class 文件和 MANIFEST.MF 文件) 放在同一个目录下。

现在我想要创建一个可执行的 Jar 文件。为此,我已经完成了以下步骤:

jar cvfm MyJar.jar *.*

创建出JAR文件之后,但是当我尝试执行它时,会显示一个消息 Java异常发生

有人能帮我解决一下吗? 我想要实现在用户双击时执行这个程序。

除了以上的内容,有人能告诉我创建可执行JAR所需遵循的确切步骤吗?

我使用的是 Windows7 32位jdk7


1
有特定的Java异常吗?一条消息会很有帮助;甚至更好的是一个堆栈跟踪。清单文件可能是罪魁祸首。 - Captain Giraffe
即使在控制台窗口中运行它,你也是这样吗?你使用的是什么集成开发环境?你没有用记事本吗? - Captain Giraffe
@Captain:不,如果我只是执行程序而没有创建jar文件,就不会出现错误或异常。 - Mohammad Faisal
在 catch 子句中请执行 e.printStackTrace();。请满足我们的要求 =) - Captain Giraffe
编辑您的问题以包括输出。 - Captain Giraffe
显示剩余6条评论
1个回答

9
命令行中jarm选项表示你将提供清单文件作为以下参数(在这种情况下,在jar文件本身之后)。所以我猜你想要:
jar cvfm MyJar.jar MANIFEST.MF SystemShutdown.class

请查看jar工具文档以获取更多详细信息。
编辑:我刚刚尝试了一下,它可以正常工作。 代码:
// In Test.java
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

// Manifest in MANIFEST.MF:
Manifest-Version: 1.0
Main-Class: Test

命令行和输出:

javac Test.java
jar cvfm test.jar MANIFEST.MF Test.class
java -jar test.jar
Hello

请注意,如果您在清单文件中的Main-Class行末尾没有换行符,那么这将导致错误,但它的规范性更好地说明了这一点。
Failed to load Main-Class manifest attribute from test.jar

问题仍然存在。 - Mohammad Faisal
@Captain Giraffe:很有可能-我怀疑它不会像“java -jar jarfile.jar”一样附加到控制台,这就是为什么我建议直接使用“java”...我们需要更多的信息。 - Jon Skeet
@jon:当我尝试运行“java -jar MyJar.jar”时,出现了空指针异常。 - Mohammad Faisal
1
@Mohammad:好的,我们有更多信息了。请展示NullPointerException的完整堆栈跟踪。 - Jon Skeet
1
@Mohammad:请不要只是添加与此无关的额外问题评论。如果我看到一个我可以回答的问题,我会这样做——如果每个人都吸引我的注意力来回答他们的问题,那么我将有太多的评论需要阅读。 - Jon Skeet
显示剩余19条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接