创建包含外部文本和ser文件的Runnable Jar

时间:2014-09-03 15:08:52

标签: java jar executable-jar

好吧,我尝试了很多方法来创建可执行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

picture with needed files

我的问题是:如何添加该文件?能否请你详细解答一下。一个条件。我无法更改该文件的位置。

我读到了Maven的一些解决方案,由于缺乏对Maven的了解,我想避免使用。

提前致谢,快速回复

2 个答案:

答案 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.sersales.ser的{​​{1}},因为......它们不存在(在您的项目中 - 至少不在您的github中)。

看起来你正在使用bash,所以你将编写一个简单的bash脚本。我会创建order.ser.bat文件,这很常见,可以让Windows和Unix用户访问

答案 1 :(得分:0)

最简单的方法是提取现有的JAR文件,包含带有外部文本和服务器文件的文件夹,然后重新打包JAR

  1. 在出现问题的地方制作原始fruitStoreApp.jar的副本。
  2. 要从命令行提取JAR文件,请运行jar xf fruitStoreApp.jar
  3. 复制您的model文件夹(以及其他任何内容)。
  4. 删除旧的fruitStoreApp.jar,以便它不会包含在下一个重新启动步骤中。
  5. 通过运行jar cf fruitStoreApp.jar *来重新包装所有工件。
  6. 使用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>
    

    这会将classesmodelimagesGUI文件夹中的所有文件组合在一起,形成一个名为fruitStoreApp.jar的文件。我假设您的所有.class文件都在classes文件夹中。

相关问题