Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:将文件添加到jar目录_Java_Eclipse_Maven_Jar_Processbuilder - Fatal编程技术网

java:将文件添加到jar目录

java:将文件添加到jar目录,java,eclipse,maven,jar,processbuilder,Java,Eclipse,Maven,Jar,Processbuilder,我正在从事一个项目,该项目要求用户上传一个Java文件,该文件可以在以后编译成类文件。我已经编写了将文件上载到项目文件夹的代码。当使用Eclipse启动时,它可以完美地工作。当我将项目打包为JAR时,问题就出现了。代码抛出一个异常。我明白原因。。当我们打包项目时,JAR中只加载类文件,而不加载源文件,JAR文件的位置也会有所不同 让我解释一下我已经做了什么以及我需要做什么: 在项目的IDE版本中,我有如下内容: 用户可以在其中浏览文件并单击上载按钮将其添加到项目结构中。这与以下代码完美配合:

我正在从事一个项目,该项目要求用户上传一个Java文件,该文件可以在以后编译成类文件。我已经编写了将文件上载到项目文件夹的代码。当使用Eclipse启动时,它可以完美地工作。当我将项目打包为JAR时,问题就出现了。代码抛出一个异常。我明白原因。。当我们打包项目时,JAR中只加载类文件,而不加载源文件,JAR文件的位置也会有所不同

让我解释一下我已经做了什么以及我需要做什么:

在项目的IDE版本中,我有如下内容:
用户可以在其中浏览文件并单击上载按钮将其添加到项目结构中。这与以下代码完美配合:

String path = Paths.get(".").toAbsolutePath().normalize().toString()+"\\path\\to\\directory";
File source=new File(textField1.getText());
String fileName="";
try {
    fileName=new java.io.File(textField1.getText()).getName();
    Files.copy(source.toPath(),new java.io.File(path+fileName).toPath(),REPLACE_EXISTING);
} catch (IOException e2) {
    e2.printStackTrace();
}
try {
        String fileName = "shellFile.sh";
        URL location=MainClass.class.getProtectionDomain().getCodeSource().getLocation();
        String p = URLDecoder.decode(location.getFile(), "UTF-8");
        System.out.println(location);
        String inputFilePath = p + fileName;
        System.out.println(inputFilePath);
        Process process = Runtime.getRuntime().exec(inputFilePath);
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
当我必须使用JAR文件运行相同的代码时,我知道我应该更改如何获取项目的根目录,然后导航到所需的目录。不知怎么的,我不能让它工作。我已经尝试了以下方法:

URL location=MainClass.class.getProtectionDomain().getCodeSource().getLocation();
String p = URLDecoder.decode(location.getFile(), "UTF-8");
System.out.println(location);
这将打印
rsrc:./
。如何将上传的文件复制到Jar文件中所需的目录

我还尝试了另一种方法,其中我考虑创建一个shell脚本来执行
jar uf-jar文件输入文件
。我将JAR文件和这个shell脚本放在同一个目录中,并执行以下代码:

String path = Paths.get(".").toAbsolutePath().normalize().toString()+"\\path\\to\\directory";
File source=new File(textField1.getText());
String fileName="";
try {
    fileName=new java.io.File(textField1.getText()).getName();
    Files.copy(source.toPath(),new java.io.File(path+fileName).toPath(),REPLACE_EXISTING);
} catch (IOException e2) {
    e2.printStackTrace();
}
try {
        String fileName = "shellFile.sh";
        URL location=MainClass.class.getProtectionDomain().getCodeSource().getLocation();
        String p = URLDecoder.decode(location.getFile(), "UTF-8");
        System.out.println(location);
        String inputFilePath = p + fileName;
        System.out.println(inputFilePath);
        Process process = Runtime.getRuntime().exec(inputFilePath);
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
但我有以下例外:

java.io.IOException:无法运行程序“../shellFile.sh”:CreateProcess error=2,系统找不到指定的文件 位于java.lang.ProcessBuilder.start(未知源)


是否有任何方法可以将文件上载到JAR文件中的目录?

String cmd=“JAR uvf”+++++运行时类路径中的任何.JAR文件都应视为只读文件。正如您所发现的,无法保证这些.jar文件将是物理文件。我可以确保包存在。如果我关闭jar文件并运行
jar uf jar-file.jar input file.java
,它就可以正常工作。我不知道如何从jar文件本身通过编程实现这一点,这是不相关的。在运行时,类加载器的内部实现可以按照自己的意愿提供类。您不能可靠地假设.jar文件在运行时可以作为文件使用。即使在它们是文件的情况下,您也不能可靠地假设您能够修改它们。特别是,我注意到Java的Windows版本会锁定每个runtime.jar文件。Windows操作系统确实在执行过程中锁定了jar文件,这从运行
jar uf-jar-file-input-filè
命令时收到的错误可以看出。我认为我的问题没有可行的解决办法。在运行jar文件之前,我应该考虑添加编译后的.class文件。谢谢你的帮助!
String cmd = "jar uvf " + <jar file name> + " " + <name of file to be added;
System.out.println(cmd);
Process p = Runtime.getRuntime().exec(cmd);