将exe文件包含到Netbeans Java项目中

3
我想在NetBeans项目中包含一个文件,我正在使用Java语言开发PC应用程序。我在网络上搜索了很多,但是没有找到任何有用信息。当我编译应用程序时,如果我进入包含/dist的路径,exe文件并不存在于此处。 非常感谢。
String exec [] = {getClass().getClassLoader().getResource("inc_volume.exe").getPath() };
                System.out.println(exec[0]);
                Runtime.getRuntime().exec(exec);

2014年8月20日15:29更新

我已经找到了从jar文件中提取此源代码的方法,但是我不知道如何使用:

    java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile);
java.util.Enumeration enumEntries = jar.entries();
while (enumEntries.hasMoreElements()) {
    java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement();
    java.io.File f = new java.io.File(destDir + java.io.File.separator + file.getName());
    if (file.isDirectory()) { // if its a directory, create it
        f.mkdir();
        continue;
    }
    java.io.InputStream is = jar.getInputStream(file); // get the input stream
    java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
    while (is.available() > 0) {  // write contents of 'is' to 'fos'
        fos.write(is.read());
    }
    fos.close();
    is.close();
}

这是图片:

enter image description here


Lorenzo,当你构建Java项目时,会在“dist”文件夹中得到一个jar文件作为结果。如果你已经将某个文件包含到你的项目中,它会被封装到这个jar文件中。如果你不熟悉Java,我建议你先学习基础知识。否则,你将会遇到很多难以克服的问题。从这里开始:http://www.homeandlearn.co.uk/java/java.html - user784540
1
为什么会有踩票呢?可耻。 - peterh
@RafaelOsipov 怎样将 exe 文件包含到项目中,以便在编译文件时,能够一起得到 jar 文件? - Lorenzo Sogliani
1
@PeterHorvath 我不知道,这个社区里有些愚蠢的人。 - Lorenzo Sogliani
为什么不将项目和 .exe 文件一起打包成一个 jar 文件,然后部署该项目并尝试相同的操作呢! - Am_I_Helpful
显示剩余2条评论
1个回答

4
要将一个exe文件包含到您的项目中,请通过文件系统将此exe文件复制到Netbeans项目的src文件夹中。

exe file into your project

当您构建完项目后,该exe文件将被打包到项目的jar文件中。

exe file packaged into jar file

在运行时,如果要运行此exe文件,您需要从您的jar文件中提取此exe文件

当此exe文件被提取后,您可以执行它。

如果要从Java代码启动外部应用程序,我建议使用Apache Commons Exec:http://commons.apache.org/proper/commons-exec/


更新

以下是一个示例类,演示如何从当前运行的jar文件中提取所有exe文件。我使用了这些SO帖子来制作这个类:第一个第二个

import java.io.File;
import java.io.IOException;

/**
 *
 */
public class TestClass {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {

        extractExeFiles("C://Temp");

    }


    /**
     * Gets running jar file path.
     * @return running jar file path.
     */
    private static File getCurrentJarFilePath() {
        return new File(TestClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    }

    /**
     * Extracts all exe files to the destination directory.
     * @param destDir destination directory.
     * @throws IOException if there's an i/o problem.
     */
    private static void extractExeFiles(String destDir) throws IOException {
        java.util.jar.JarFile jar = new java.util.jar.JarFile(getCurrentJarFilePath());
        java.util.Enumeration enumEntries = jar.entries();
        String entryName;
        while (enumEntries.hasMoreElements()) {
            java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement();
            entryName = file.getName();
            if ( (entryName != null) && (entryName.endsWith(".exe"))) {
                java.io.File f = new java.io.File(destDir + java.io.File.separator + entryName);
                if (file.isDirectory()) { // if its a directory, create it
                    f.mkdir();
                    continue;
                }
                java.io.InputStream is = jar.getInputStream(file); // get the input stream
                java.io.FileOutputStream fos = new java.io.FileOutputStream(f);
                while (is.available() > 0) {  // write contents of 'is' to 'fos'
                    fos.write(is.read());
                }

                fos.close();
                is.close();                
            }
        }
    }
}

好的,我已经成功将jar文件添加到exe文件中了,现在如何自动删除它们或使用以下命令运行它们: Runtime.getRuntime().exec("inc_volume.exe"); - Lorenzo Sogliani
我不建议从jar文件中删除exe文件,因为它是打包的,并且对于您的应用程序是必要的。如果您将其删除并提取它,则如果删除或转移到另一个文件夹中,则无法执行此jar文件。如果始终包含exe文件,则可以将其提取到临时文件夹中,执行并删除此exe文件。关于启动文件,我更喜欢使用Apache Commons Exec而不是调用Runtime.getRunime.exec()。如果您不想使用Apache Commons Exec,请查看此帖子:https://dev59.com/JGYr5IYBdhLWcg3wDGHP - user784540
那段代码提取了jar文件的所有内容,你不需要提取所有内容,只需按照代码中所示迭代jar条目,并仅提取与相应jar条目对应的exe文件。当你获取一个jar条目时,有一个方法:getName(),用它来确定何时将你的exe文件打包到此jar中,并提取它。忽略所有其他条目即可。 - user784540
1
什么都没问题,我们已经解决了。非常感谢 :) @Rafael Osipov - Lorenzo Sogliani
@LorenzoSogliani,你是如何解决访问被拒绝的问题的?我也遇到了同样的问题。 - captaindroid
显示剩余8条评论

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