jar 编译 Runtime.getRuntime.exec() jar 中的完整目录
jar compile Runtime.getRuntime.exec() full directory in jar
只是为了好玩,我正在制作一个小的 Java 项目文件来保存在我的保管箱中,以便在没有 ide 的情况下为我编译 java 比输入所有那些讨厌的命令行更容易我自己争论。
现在我只有一个小问题...
首先,这是我的代码,它设法将 class 文件编译成带有清单的 jar。
public static String listFilesString(String dirLocation){
String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces
File f = new File(dirLocation);
if(f.isDirectory()&&f.list().length>0){
for(File f2 : f.listFiles()){
if(f2.isDirectory()){
allPaths = allPaths + listFilesString(f2.toString());
} else {
allPaths = allPaths + f2.toString() + " ";
}
}
}
return allPaths;
}
public static boolean compileOutputToJar(String output, String jarLocation){
output = output.replace('\', '/'); //replacements just for uniformity
String binF = WorkspaceVariables.workspaceDir+output;
String toCompile = listFilesString(binF).replace('\', '/');
try {
Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem
System.out.println("Compiled Workspace to Jar!");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
正如在包含 Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile) 的行中所评论的那样;这就是问题发生的地方。事实上,命令正确执行,但我确实提供了 ide 要编译到 jar 中的 class 文件的完整路径。
作为示例,我将使用此编译的示例项目。目录结构为:
/bin/manifest.txt < The manifest is compiled properly
/bin/Main.class < Calls k.Me to get the n variable which is printed
/bin/k/Me.class < Defines a string 'n' equal to "hi"
然而,这被编译到 jar 中:
META_INF/MANIFEST.MF
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/Main.class
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/manifest.txt < Nevermind this inclusion, just a problem I've not fixed.
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/k/Me.class
问题很明显,这个文件不能运行,明明是编译错误。我可以通过在执行前更改到它们所在的目录来正确编译它(找不到执行此操作的方法)。或者可能在命令执行期间更改位置(我尝试使用 -cp,但无济于事)。
最好的选择似乎是使用 -C 因为它可以将 Main.class 和 manifest.txt 移动到适当的位置,但是它不包括 [=35] 的子目录=] 并且 k 文件夹不再存在。并通过添加“-C”+ f2.getParent() +“”将其添加到每个文件名的开头。在 listFilesString 方法中完全阻止任何 class 文件编译到 jar 中。
感谢您的帮助/贡献!
少了一行,我稍作调整纠正了错误。
public static String listFilesString(String dirLocation){
String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces
File f = new File(dirLocation);
if(f.isDirectory()&&f.list().length>0){
for(File f2 : f.listFiles()){
if(f2.isDirectory()){
allPaths = allPaths + f2.toString() + " "; //THIS LINE WAS ADDED
allPaths = allPaths + listFilesString(f2.toString());
} else {
allPaths = allPaths + f2.toString() + " ";
}
}
}
return allPaths;
}
public static boolean compileOutputToJar(String output, String jarLocation){
output = output.replace('\', '/'); //replacements just for uniformity
String binF = WorkspaceVariables.workspaceDir+output;
String toCompile = listFilesString(binF).replace('\', '/');
try {
Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem
System.out.println("Compiled Workspace to Jar!");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
只是为了好玩,我正在制作一个小的 Java 项目文件来保存在我的保管箱中,以便在没有 ide 的情况下为我编译 java 比输入所有那些讨厌的命令行更容易我自己争论。
现在我只有一个小问题... 首先,这是我的代码,它设法将 class 文件编译成带有清单的 jar。
public static String listFilesString(String dirLocation){
String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces
File f = new File(dirLocation);
if(f.isDirectory()&&f.list().length>0){
for(File f2 : f.listFiles()){
if(f2.isDirectory()){
allPaths = allPaths + listFilesString(f2.toString());
} else {
allPaths = allPaths + f2.toString() + " ";
}
}
}
return allPaths;
}
public static boolean compileOutputToJar(String output, String jarLocation){
output = output.replace('\', '/'); //replacements just for uniformity
String binF = WorkspaceVariables.workspaceDir+output;
String toCompile = listFilesString(binF).replace('\', '/');
try {
Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem
System.out.println("Compiled Workspace to Jar!");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
正如在包含 Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile) 的行中所评论的那样;这就是问题发生的地方。事实上,命令正确执行,但我确实提供了 ide 要编译到 jar 中的 class 文件的完整路径。
作为示例,我将使用此编译的示例项目。目录结构为:
/bin/manifest.txt < The manifest is compiled properly
/bin/Main.class < Calls k.Me to get the n variable which is printed
/bin/k/Me.class < Defines a string 'n' equal to "hi"
然而,这被编译到 jar 中:
META_INF/MANIFEST.MF
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/Main.class
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/manifest.txt < Nevermind this inclusion, just a problem I've not fixed.
Users/MYUSERNAME/Desktop/Other/ide/javas/bin/k/Me.class
问题很明显,这个文件不能运行,明明是编译错误。我可以通过在执行前更改到它们所在的目录来正确编译它(找不到执行此操作的方法)。或者可能在命令执行期间更改位置(我尝试使用 -cp,但无济于事)。
最好的选择似乎是使用 -C 因为它可以将 Main.class 和 manifest.txt 移动到适当的位置,但是它不包括 [=35] 的子目录=] 并且 k 文件夹不再存在。并通过添加“-C”+ f2.getParent() +“”将其添加到每个文件名的开头。在 listFilesString 方法中完全阻止任何 class 文件编译到 jar 中。
感谢您的帮助/贡献!
少了一行,我稍作调整纠正了错误。
public static String listFilesString(String dirLocation){
String allPaths = ""; //pretty self explanatory returns full list of files in directory with spaces
File f = new File(dirLocation);
if(f.isDirectory()&&f.list().length>0){
for(File f2 : f.listFiles()){
if(f2.isDirectory()){
allPaths = allPaths + f2.toString() + " "; //THIS LINE WAS ADDED
allPaths = allPaths + listFilesString(f2.toString());
} else {
allPaths = allPaths + f2.toString() + " ";
}
}
}
return allPaths;
}
public static boolean compileOutputToJar(String output, String jarLocation){
output = output.replace('\', '/'); //replacements just for uniformity
String binF = WorkspaceVariables.workspaceDir+output;
String toCompile = listFilesString(binF).replace('\', '/');
try {
Runtime.getRuntime().exec("jar cvfm " + jarLocation + " " + binF + "manifest.txt " + toCompile); // this line represents the problem
System.out.println("Compiled Workspace to Jar!");
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}