我希望java在正在运行的jar的同一文件夹中查找.properties文件。我该怎么做?我如何确定应用程序是在IDE中运行还是作为显式jar文件
答案 0 :(得分:0)
您可以通过以下方式访问此文件(如果它在您的类路径中):
Paths.get(this.getClass().getResource("file.properties").toURI());
答案 1 :(得分:0)
首先,我必须说这本质上是一种不好的做法,虽然生活往往并不完美,有时候我们不得不忍受糟糕的设计冲击。
这是我为我的宠物项目而设的课程,需要这样的功能:
public class ArbitraryPath {
private static Logger logger = LogManager.getLogger("utility");
private static boolean isRunFromJar = false;
public static String resolveResourceFilePath(String fileName, String folderName, Class<?> requestingClass) throws URISyntaxException{
// ARGUMENT NULL CHECK SAFETY HERE
String fullPath = requestingClass.getResource("").toURI().toString();
isRunFromJar = isRunFromJar(fullPath);
String result = "";
if(!isRunFromJar){
result = trimPathDownToProject(requestingClass.getResource("").toURI());
}
result = result+folderName+"/"+fileName+".properties";
return result;
}
private static String trimPathDownToProject(URI previousPath){
String result = null;
while(!isClassFolderReached(previousPath)){
previousPath = previousPath.resolve("..");
}
previousPath = previousPath.resolve("..");
result = previousPath.getPath();
return result;
}
private static boolean isClassFolderReached(URI currentPath){
String checkableString = currentPath.toString();
checkableString = checkableString.substring(0,checkableString.length()-1);
checkableString = checkableString.substring(checkableString.lastIndexOf("/")+1,checkableString.length());
if(checkableString.equalsIgnoreCase("bin")){
return true;
} else {
return false;
}
}
private static boolean isRunFromJar(String fullPath) throws URISyntaxException{
String solidClassFolder = "/bin/";
String solidJarContainer = ".jar!";
if(!fullPath.contains(solidClassFolder)){
if(fullPath.contains(solidJarContainer)){
return true;
} else {
logger.error("Requesting class is not located within a supported project structure!");
throw new IllegalArgumentException("Requesting class must be within a bin folder!");
}
} else {
return false;
}
}
}
我想有点解释是为了......
总的来说,这将尝试解析位于任意项目中的属性文件的文件路径。这意味着ArbitraryPath类不需要与属性文件位于同一个项目中,当您想要在单独的项目中分离例如JUnit测试时,这会派上用场。它将根据您提供的类识别项目,该类应与您要查找的属性文件位于同一项目中。
首先,它获得了你在这一行中给出的类的路径:
String fullPath = requestingClass.getResource("").toURI().toString();
然后它检查此类是否在JAR文件中,或者是否从IDE执行。这是通过检查路径是否包含“/ bin /”来完成的,这通常意味着它是从IDE或“.jar!”执行的。这通常意味着它是从JAR执行的。如果您有不同的项目结构,则可以修改方法。
如果确定从JAR运行 NOT ,那么我们将路径向下修剪到项目文件夹,向后沿路径向下,直到我们到达BIN文件夹。再次,如果您的项目结构偏离标准,请更改此项。
(如果我们确定 IS 从JAR文件运行,那么我们不会修剪任何内容,因为我们已经获得了基本文件夹的路径。)
之后,我们检索了项目文件夹的路径,因此我们添加了属性文件所在文件夹的名称(如果有的话),并添加了我们想要的属性文件的文件名和扩展名。定位。
然后我们返回此路径。然后我们可以在InputStream中使用此路径,如:
FileInputStream in = new FileInputStream(ArbitraryPath.resolveResourceFilePath("myPropertiesFile", "configFolder", UserConfiguration.class));
将检索UserConfiguration.class所在的项目文件夹中myConfiguration文件夹中的myPropertiesFile.properties。
请注意,本课程假设您有标准的项目配置。 随意适应您的需求等。
这也是一种真正的hackish和粗暴的方式。
答案 2 :(得分:-1)
String absolutePath = null;
try {
absolutePath = (new File(Utils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath())).getCanonicalPath();
absolutePath = absolutePath.substring(0, absolutePath.lastIndexOf(File.separator))+File.separator;
} catch (URISyntaxException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
}