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

Mik*_*ens 1 java jar binaryfiles batch-file

我不是在寻找如何让我的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
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助...

Mik*_*ens 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
Run Code Online (Sandbox Code Playgroud)

注意:重要的是不要只使用%0.如果将批处理文件作为"RemoveFiles"运行,它将无法工作,因为$.0中的".bat"将丢失.如果它作为"RemoveFiles.bat"运行,则%0将是完整文件名,允许Java将批处理文件定位为JAR文件.

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

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