如何在运行时获取jar路径

时间:2015-02-02 10:20:43

标签: java properties jar

我希望java在正在运行的jar的同一文件夹中查找.properties文件。我该怎么做?我如何确定应用程序是在IDE中运行还是作为显式jar文件

3 个答案:

答案 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);
}