好吧,我尝试了很多方法来创建可执行jar,但是4小时后我放弃了。我正在尝试使用我的项目制作可执行jar文件,其中主类在控制器中。基本上我尝试使用各种选项的export / runnable JAR文件,包括生成ant脚本。我在终端
中总是有类似的错误当我用终端
运行时java -jar fruitStore.jar
它说
bmj@OZ:~/Documents$ java -jar fruitStoreApp.jar
java.io.FileNotFoundException: customers.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadCustomers(Shop.java:250)
at model.Shop.<init>(Shop.java:121)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.io.FileNotFoundException: users.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadUsers(Shop.java:210)
at model.Shop.<init>(Shop.java:122)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.io.FileNotFoundException: suppliers.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadSuppliers(Shop.java:190)
at model.Shop.<init>(Shop.java:123)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.io.FileNotFoundException: stocks.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadStock(Shop.java:230)
at model.Shop.<init>(Shop.java:124)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.io.FileNotFoundException: sales.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadSales(Shop.java:150)
at model.Shop.<init>(Shop.java:126)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
java.io.FileNotFoundException: orders.ser (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at model.Shop.loadOrders(Shop.java:170)
at model.Shop.<init>(Shop.java:127)
at model.Shop.getInstance(Shop.java:140)
at model.Model.<init>(Model.java:12)
at GUI.CustomerMainPanel.<init>(CustomerMainPanel.java:24)
at GUI.MainMenuGUI.<init>(MainMenuGUI.java:50)
at GUI.MainMenuGUI.getInstance(MainMenuGUI.java:35)
at model.View.<init>(View.java:49)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1301)
at GUI.WelcomeScreenGUI.<init>(WelcomeScreenGUI.java:33)
at model.View.<init>(View.java:51)
at model.Controller.<init>(Controller.java:42)
at model.Controller.main(Controller.java:805)
... 5 more
我知道问题出在哪里。它没有将图片上的标记文件附加到jar
我的问题是:如何添加该文件?能否请你详细解答一下。一个条件。我无法更改该文件的位置。
我读到了Maven的一些解决方案,由于缺乏对Maven的了解,我想避免使用。
提前致谢,快速回复
答案 0 :(得分:1)
完成代码后,我看到您设置了文件名,并且您正在使用从文件系统中读取的FileInputStream
。
private String saleFile = "sales.ser";
...
public void loadSales(String inPutFile) {
try {
FileInputStream fileIn = new FileInputStream(inPutFile);
那么将要发生的是程序将在当前工作目录中查找sale.ser
。在您的IDE中,工作目录通常是项目根目录,这是您的文件所在的位置,这就是它工作的原因。
因为你不能改变代码,这里有一些建议。
运行jar时,需要从当前工作目录运行jar。导出jar时,将其导出到项目根目录。当您运行时,请确保您 项目根目录
可能更好的方法是编写脚本来启动程序(这很常见)。这样可以更灵活地启动应用的方式/位置。我不是写脚本的最好的,所以我只是把最基本的,但你可能想要根据你想要启动应用程序和找到资源的方式更复杂。使用下面的.bat文件示例,.bat文件也应该在项目根目录
中@echo off
setlocal
if "%JAVACMD%" == "" set JAVACMD=%JAVA_HOME%\bin\java.exe
if "%FRUITSTAND_HOME%" == "" set FRUITSTAND_HOME=%~dp0
cd "%FRUITSTAND_HOME%"
"%JAVACMD%" -cp "%FRUITSTAND_HOME%\lib\*" -jar "%FRUITSTAND_HOME%\fruitStoreApp.jar"
endlocal
然后(从项目根目录)只需运行fruitStoreApp.bat
。
我测试了它并且它有效。我只是获得了FileNotFoundException
stocks.ser
和sales.ser
的{{1}},因为......它们不存在(在您的项目中 - 至少不在您的github中)。
看起来你正在使用bash,所以你将编写一个简单的bash脚本。我会创建order.ser
和.bat
文件,这很常见,可以让Windows和Unix用户访问
答案 1 :(得分:0)
最简单的方法是提取现有的JAR
文件,包含带有外部文本和服务器文件的文件夹,然后重新打包JAR
。
fruitStoreApp.jar
的副本。JAR
文件,请运行jar xf fruitStoreApp.jar
。 model
文件夹(以及其他任何内容)。fruitStoreApp.jar
,以便它不会包含在下一个重新启动步骤中。jar cf fruitStoreApp.jar *
来重新包装所有工件。 使用ANT
如果您想使用ant
尝试此操作,可以在fileset
任务中加入jar
类型,如下所示:
<target name="package">
<jar destfile="fruitStoreApp.jar" >
<fileset dir="classes"/>
<fileset dir="model" />
<fileset dir="images" />
<fileset dir="GUI" />
</jar>
</target>
这会将classes
,model
,images
,GUI
文件夹中的所有文件组合在一起,形成一个名为fruitStoreApp.jar
的文件。我假设您的所有.class
文件都在classes
文件夹中。