【问题标题】:Turning Java Project into something runnable [duplicate]将Java项目变成可运行的东西[重复]
【发布时间】:2022-11-08 03:08:23
【问题描述】:

我在我就读的大学的成像系工作,我们要做的一件事就是在处理票证时不断复制/粘贴这些罐头回复,然后用票证的特定信息填充所有空白处.这足以激发我在空闲时间制作一个 java 项目来生成这些响应并填写所有信息以节省一些时间/练习编码。

在这个项目中有两个类,一个包含我的所有票证信息,另一个运行程序的主要部分(分别为 Ticket.java 和 ThingThatWork.java)。

票务.java

package quickResponse;

import java.util.Scanner;

public class Ticket {
    Scanner scanner = new Scanner(System.in);   
    String make;
    String model;
    String whiteTag;
    String poNumber;
    String SN;
    String signatureName;
    
    public Ticket() {
        setMake("");
        setModel("");
        setWhiteTag("");
        setSN("");
        setSignatureName("");
    }
    
    public Ticket(String make, String model, String whiteTag) {
        setMake(make);
        setModel(model);
        setWhiteTag(whiteTag);
        setSN(SN);
        setSignatureName(signatureName);
    }
    
    public String getMake() {
        return make;
    }
    
    public String getModel() {
        return model;
    }
    
    public String getWhiteTag() {
        return whiteTag;
    }
    
    public String getPoNumber() {
        return poNumber;
    }
    public String getSN() {
        return SN;
    }
    public String getSignatureName() {
        return signatureName;
    }
    
    public void setMake(String make) {
        this.make = make;
    }
    
    public void setModel(String model) {
        this.model = model;
    }
    
    public void setWhiteTag(String whiteTag) {
        this.whiteTag = whiteTag;
    }
    
    public void setPoNumber(String poNumber) {
        this.poNumber = poNumber;
    }
    public void setSN(String SN) {
        this.SN = SN;
    }
    public void setSignatureName(String signatureName) {
        this.signatureName = signatureName;
    }
    
    public void ticketInfo(boolean typeOfImage) {
            scanner.nextLine();
            System.out.println("Make: ");
            setMake(scanner.nextLine());
            System.out.println("Model: ");
            setModel(scanner.nextLine());
            System.out.println("White Tag: ");
            setWhiteTag(scanner.nextLine());
            System.out.println("Serial Number: ");
            setSN(scanner.nextLine());
            if(typeOfImage == true) {
                System.out.println("PO Number: ");
                setPoNumber(scanner.nextLine());
        }
            System.out.println("Enter Name: ");
            setSignatureName(scanner.nextLine());
    }
    
    public boolean imageOrReimage() {
        int bool = 0;
        while(bool != 1 || bool != 2) {
            System.out.println("Is this computer for imaging or reimaging?");
            System.out.println("1. Imaging");
            System.out.println("2. Reimaging");
            bool = scanner.nextInt();
            
            if(bool >= 3) {
                System.out.println("Not a valid selection!");
            }
            else {
                if(bool == 1) {
                    return true;
                }
                if(bool == 2) {
                    return false;
                }
            }
        }
        return false;
    }
    
    public String desktopOrLaptop() {
        int bool = 0;
        while(bool != 1 || bool != 2) {
            System.out.println("Is this a laptop or desktop?");
            System.out.println("1. Laptop");
            System.out.println("2. Desktop");
            bool = scanner.nextInt();
            
            if(bool >= 3) {
                System.out.println("Not a valid selection!");
            }
            else {
                if(bool == 1) {
                    return "laptop";
                }
                if(bool == 2) {
                    return "desktop";
                }
            }
        }
        return " ";
    }
    
    
    
    public String generateTitle(boolean imageOrReimage) {
        if(imageOrReimage == true) {
            return "Image | "+getMake()+" "+getModel()+" | WT#: "+getWhiteTag()+" | PO#: "+getPoNumber();
        }
        else {
            return "Reimage | "+getMake()+" "+getModel()+" | WT#: "+getWhiteTag();
        }
    }
    
    public String generateMessageBody(boolean imageOrReimage, String desktopOrLaptop) {
        if (imageOrReimage == true) {
            return "Hello,\n\nWe've recieved a new "+getMake()+" "+getModel()+" with white inventory tag #"+
                    getWhiteTag()+" and PO#"+getPoNumber()+". Before we can begin working on this device, "+
                    "could you please answer the following questions for us:\n\n*Who will this "+desktopOrLaptop+
                    " be used by?\n*Where will this "+desktopOrLaptop+" be located?\n*Will any additional "+
                    "programs need to be installed? Please provide any licensing information for paid programs "+
                    "such as Adobe Acrobat Pro.\n\nThanks,\n"+getSignatureName()+"\nTechnology Support"
                    +"\nThe University of Tyler at Texas.";
        }
        else {
            return "Hello,\n\nWe have picked up a "+getMake()+" "+getModel()+" with white inventory tag #"+
                    getWhiteTag()+".\n\nJust for confirmation before we begin the reimaging process,"+
                    " could you please answer the following questions:\n\n*Will any data need to be"+
                    " backed up before it is wiped and reimaged?\n*Who will this device belong to, along"+
                    " with their room number location?\n*Will any additional programs need to be installed?"+
                    " Please provide the licensing information for paid programs such as Adobe Acrobat Pro."+
                    "\n\nThanks,\n"+getSignatureName()+"\nTechnology Support\nThe University of Texas at Tyler";
        }
    }
    
    public String generateWorkNotes(boolean imageOrReimage) {
        String string;
        string = "Make: "+getMake()+"\nModel: "+getModel()+"\nWhite Tag: "+getWhiteTag()
            +"\nS/N: "+getSN();
        if(imageOrReimage == true) {
            string = string+"\nPO Number: "+getPoNumber();
        }
        return string;
    }
    
    @Override
    public String toString() {
        return "Make: "+getMake()+"\nModel: "+getModel()+"\nWhite Tag: "+getWhiteTag()
            +"\nS/N: "+getSN()+"\nPO Number: "+getPoNumber();   
    }
    @Override
    public boolean equals(Object o) {
        return toString().equals(o.toString());
    }
}

ThingThatWorks.java

package quickResponse;

public class ThingThatWorks {

    public static void main(String[] args) {
        Ticket newTicket = new Ticket();
        boolean imageOrReimage = false;
        String desktopOrLaptop = "";
        imageOrReimage = newTicket.imageOrReimage();
        newTicket.ticketInfo(imageOrReimage);
        
        if(imageOrReimage == true) 
            desktopOrLaptop = newTicket.desktopOrLaptop();
        
        System.out.println();
        System.out.println(newTicket.generateTitle(imageOrReimage));
        System.out.println();
        System.out.println(newTicket.generateMessageBody(imageOrReimage, desktopOrLaptop));
        System.out.println();
        System.out.println("---------------------------");
        System.out.println(newTicket.generateWorkNotes(imageOrReimage));
        
    }

}

我希望能够将其转换为可运行的 JAR 或 .exe 文件,以便在制作票证时可以在工作计算机上运行它。不幸的是,我看的 youtube 视频不清楚,当我从 Eclipse 将项目导出为可运行的 .jar 文件时,它给了我一个非特定的 JNI 错误(发生了一个 JNI 错误,请检查您的安装并重试)和一个非特定的 Java 异常错误(发生了一个 Java 异常)。我不确定我哪里出错了,我也不确定我是否在我的代码中编写了所有我需要的东西来抛出一个 cmd 窗口,让我输入我需要的东西,然后挂在那里足够长的时间让我复制它。

任何帮助,将不胜感激。

编辑:当我意识到我是在 Java 17 中编写它然后通过 Java 8 编译它时,设法让错误消失。我安装了 Java 17,重新导出了程序,现在它在运行时什么都不做,而不是给我错误。

我尝试过的一件事是通过命令行运行它,但无论我做什么,它都会给我错误“无法访问 jarfile”

编辑2:亚当的最初答案最终成为关键,当它编译为java 17时,我试图将它作为java 8运行。在确保我使用的是正确的版本而不是过时的安装后,我设法让程序运行从命令行。

谢谢大家的帮助

【问题讨论】:

  • 您的 ThingThatWorks.java 文件包含一个具有不同名称的类。这是写这个问题的错字还是在你的系统上是一样的?
  • 这与我的系统上的方式相同。我不确定它“包含一个具有不同名称的类”是什么意思,除非您指的是类名本身。
  • 具有讽刺意味的是,我在之前的评论中犯了一个错字,就像我认为你可能有的那样。问题是Java 期望一个名为Xyz.java 的文件有一个类Xyz。然而,由于ThingThatWorks 位于一个名为ThingsThatWork.java 的文件中,因此预计其中的类名为ThingsThatWork
  • 啊,好吧,我明白你的意思了。在这种情况下,是的,我在写出我的问题并添加了额外的 s 时确实打错了。 Eclipse 中的类文件是 ThingThatWorks。

标签: java export


【解决方案1】:

好的,编译时尝试以下操作:

  1. 打开命令行并使用 cd 命令切换到包含 java 和 class 文件的目录
  2. 运行命令

    fsutil 文件 createnew manifest.man 0

    1. 打开创建的清单并添加以下内容:

    清单版本:1.0

    主类:Java程序

    创建者:1.8.0_144(甲骨文公司)

    1. 返回命令行并运行命令

    jar cmf manifest.man Program.jar *.class

    1. 完成。您可以使用命令运行它

    java -jar Program.jar

    或者

    java -cp Program.jar ProgramJava

【讨论】:

  • 嘿,谢谢你的建议,但你的第一个答案实际上是关键,另一半是我搞砸了 .bat 文件来运行程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2011-09-21
  • 2013-07-19
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多