我正在通过我的java程序执行exe。 路径在java中被硬编码。
我把我的exe打包在jar中。
但我被卡住了,因为我在java文件中硬编码了路径名。 因此无法将我的jar作为独立程序执行。
包装这种罐子的任何提示,即内部有一个exe并且能够 把它作为一个独立的程序运行?
谢谢, Krisp
答案 0 :(得分:33)
奇怪的是,今天早上我必须编写类似的代码...感谢你推动我完成这项工作: - )
这会将.exe
解压缩到本地磁盘上的本地文件。当Java程序存在时,该文件将被删除。
编辑:糟糕,忘了实际复制文件......
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
public class Main
{
public static void main(final String[] args)
throws URISyntaxException,
ZipException,
IOException
{
final URI uri;
final URI exe;
uri = getJarURI();
exe = getFile(uri, "Main.class");
System.out.println(exe);
}
private static URI getJarURI()
throws URISyntaxException
{
final ProtectionDomain domain;
final CodeSource source;
final URL url;
final URI uri;
domain = Main.class.getProtectionDomain();
source = domain.getCodeSource();
url = source.getLocation();
uri = url.toURI();
return (uri);
}
private static URI getFile(final URI where,
final String fileName)
throws ZipException,
IOException
{
final File location;
final URI fileURI;
location = new File(where);
// not in a JAR, just return the path on disk
if(location.isDirectory())
{
fileURI = URI.create(where.toString() + fileName);
}
else
{
final ZipFile zipFile;
zipFile = new ZipFile(location);
try
{
fileURI = extract(zipFile, fileName);
}
finally
{
zipFile.close();
}
}
return (fileURI);
}
private static URI extract(final ZipFile zipFile,
final String fileName)
throws IOException
{
final File tempFile;
final ZipEntry entry;
final InputStream zipStream;
OutputStream fileStream;
tempFile = File.createTempFile(fileName, Long.toString(System.currentTimeMillis()));
tempFile.deleteOnExit();
entry = zipFile.getEntry(fileName);
if(entry == null)
{
throw new FileNotFoundException("cannot find file: " + fileName + " in archive: " + zipFile.getName());
}
zipStream = zipFile.getInputStream(entry);
fileStream = null;
try
{
final byte[] buf;
int i;
fileStream = new FileOutputStream(tempFile);
buf = new byte[1024];
i = 0;
while((i = zipStream.read(buf)) != -1)
{
fileStream.write(buf, 0, i);
}
}
finally
{
close(zipStream);
close(fileStream);
}
return (tempFile.toURI());
}
private static void close(final Closeable stream)
{
if(stream != null)
{
try
{
stream.close();
}
catch(final IOException ex)
{
ex.printStackTrace();
}
}
}
}
答案 1 :(得分:11)
操作系统不关心或不了解.jar文件,因此在执行之前,您必须将.exe
文件解压缩到某个临时位置。
答案 2 :(得分:4)
//gets program.exe from inside the JAR file as an input stream
InputStream is = getClass().getResource("program.exe").openStream();
//sets the output stream to a system folder
OutputStream os = new FileOutputStream("program.exe");
//2048 here is just my preference
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
答案 3 :(得分:3)
虽然其他用户已正确回答了问题,但提取并运行然后清理。另一个要考虑的问题是完全原生。
您已使用本机二进制文件来完成特定任务。为什么不创建一个安装应用程序的本机安装程序,并将二进制文件安装到特定于操作系统的位置(Win32上的Program Files)并创建合适的快捷方式。
通过这种方式,您的应用程序将感觉更加原生,并且意味着您无需编写或管理代码来解决此问题。目前,Jar看起来像是一个跨平台的代码片段(Jar可以在任何地方运行吗?)但是包装了一个本地二进制文件,它不会在任何地方运行。这感觉就像一个矛盾。
对于安装人员,我可以推荐Nullsoft安装系统(NSIS),因为他们有许多优秀的教程和代码示例可供学习。
答案 4 :(得分:2)
使用
getClass().getResource(what).openStream()
并复制到磁盘中的另一个文件。
答案 5 :(得分:-5)
你可以编写一个简单的java程序来使用Runtime.exec()启动exe。然后,您可以将jar的“Main-Class”属性设置为该启动器类。然后用户可以运行你的jar,它将运行exe。