如何创建自动执行的JAR文件

时间:2014-06-04 21:47:00

标签: java batch-file jar binaryfiles

我不是在寻找如何让我的JAR可以运行,而是自我执行。我找到了这篇文章:

http://en.newinstance.it/2012/04/17/self-executing-jar-files/

我按照列出的步骤操作,并根据需要创建了我的文件。我以为我有它工作(因为它会运行),但我意识到它实际上并没有运行JAR文件(BAT文件中嵌入的文件)的正确版本,而是来自文件系统的文件。

当我从文件系统中删除JAR文件时,Java错误说它无法找到该文件。以下是" make"我为我的小测试项目创建的脚本。您需要替换自己的路径和Java文件。

任何人都可以得到一个有效的例子吗?我最终希望能够拥有一个可以使用的带有嵌入式二进制文件的自包含批处理文件。

@echo off
cd /d D:\current\battle
javac -d classes src\RemoveFiles.java
pushd classes
echo Main-Class: RemoveFiles > MANIFEST.MF
jar -cvmf MANIFEST.MF ..\RemoveFiles.jar RemoveFiles*.class 
popd
echo @java -jar RemoveFiles.jar %%^* > removeStub.bat
echo @exit /b >> removeStub.bat
copy removeStub.bat /b + RemoveFiles.jar /b RemoveFiles.bat /b

感谢您的帮助......

1 个答案:

答案 0 :(得分:7)

吉姆,是的,你是对的。实际上,我并没有完全遵循需要做的事情。虽然我指出哪个部分出错了,而不是标准的RTFM响应,你可能会更有帮助。

对于其他未来的人来说,这里是完整的/正确的/清理过的" make"批处理文件......

@echo off
setlocal
cls

set HOME_DIR=D:\current\battle
set CLASS_DIR=classes
set SRC_DIR=src
set CLASS_NAME=RemoveFiles
set STUB=stub.bat

cd /d %HOME_DIR%
javac -d %CLASS_DIR% src\%CLASS_NAME%.java
pushd %CLASS_DIR%
echo Main-Class: %CLASS_NAME% > MANIFEST.MF
jar -cvmf MANIFEST.MF ..\%CLASS_NAME%.jar %CLASS_NAME%*.class 
popd
jar -uf %CLASS_NAME%.jar %CLASS_DIR%\%CLASS_NAME%.java
echo @java -jar %%~n0%%~x0 %%* > %STUB%
echo @exit /b >> %STUB%
copy %STUB% /b + %CLASS_NAME%.jar /b %CLASS_NAME%.bat /b
del %CLASS_NAME%.jar
del %STUB%

endlocal

注意:重要的是不要只使用%0。如果将批处理文件作为" RemoveFiles"运行,则它将无效,因为" .bat"将从0美元的价值中遗漏。如果它以" RemoveFiles.bat"运行,则%0将是完整文件名,允许Java将批处理文件定位为JAR文件。

因为我们制作批处理文件以节省时间和打字,所以经常执行它们而不指定" .bat"药水。因此, %%~n0%%~x0 所做的是强制名称和扩展名,而不管命令行中指定了什么。 %符号需要被转义,因为它们被回应,这就是为什么有两个符号。在最终的批处理文件中,只有一个。

我希望这有助于下一个人寻找这个......