当前位置: 首页 > 知识库问答 >
问题:

Maven相对路径最佳实践

戚俊人
2023-03-14

我已经寻找了一段时间的实际示例,以了解Maven获取资源的相对路径最佳实践,但我感到困惑,希望您能支持我了解什么是获取资源的最佳实践,以及如何应用于具体示例:

具体示例:

结构假设我有以下结构,并试图从文件夹规划中的类中获取资源(位于资源中),所以基本上我试图创建一个与maven执行一致的相对路径的字符串:

├───.settings
├───images
├───src
│   ├───main
│   │   ├───java
│   │   │   └───com
│   │   │       └───moga
│   │   │           ├───planning --->Trying to get a resource from here
│   │   │           ├───population
│   │   │           │   ├───chromossome
│   │   │           │   ├───gene
│   │   │           │   └───initialpopulation
│   │   │           └───utils
│   │   └───resources
│   │       └───com
│   │           └───moga
│   │               └───planning
│   │                   └───sample
│   └───test
│       ├───java
│       │   └───com
│       │       └───moga
│       │           ├───planning
│       │           └───population
│       │               ├───chromossome
│       │               └───gene
│       └───resources
│           └───com
│               └───moga
│                   └───planning <-- Resource that I want to get is here
│                       └───sample
└───target
    ├───classes
    │   └───com
    │       └───moga
    │           ├───planning
    │           │   └───sample
    │           ├───population
    │           │   ├───chromossome
    │           │   ├───gene
    │           │   └───initialpopulation
    │           └───utils
    ├───generated-sources
    │   └───annotations
    ├───generated-test-sources
    │   └───test-annotations
    ├───maven-archiver
    ├───maven-status
    │   └───maven-compiler-plugin
    │       ├───compile
    │       │   └───default-compile
    │       └───testCompile
    │           └───default-testCompile
    ├───surefire-reports
    └───test-classes
        └───com
            └───moga
                ├───planning
                │   └───sample
                └───population
                    ├───chromossome
                    └───gene

类RunCapacityPlanning,它获取我当前使用的以下快速修复程序的资源

Path pathCapacityPlanningGeneral = Paths.get(System.getProperty("user.dir"),
        "src","test","resources","com","moga","planning","paramsGeneral.txt");
File file = new File(pathCapacityPlanningGeneral.toString());
if (!file.exists()) {
    System.out.println("File Do not exist");
    System.out.println(pathCapacityPlanningGeneral.toString());
}

上面的代码是用mvn包构建的,并且文件存在(不要打印消息)。

POM

...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
...

方法我发现了一些潜在的方法:

  1. Maven Official
    File file = new File( path );
    if ( !file.isAbsolute() )
    {
        file = new File( project.getBasedir(), file );
    }
    

    为了测试这种方法,我尝试了以下方法:

    由此我明白我应该把它添加到我的POM中。

      <properties>
    <project.basedir>somepath</project.basedir>
    ...
      </properties>
    
    
    • 我应该在这个路径中添加什么?我已经测试过将某些路径留空,并试图在我的课堂上打印以理解,但是它显示无法解决。
    public static void main(String[] args) throws IOException {
        // 1) Approach 1
        // $ cannot be resolved to a variable,
        // project cannot be resolved
        System.out.println(${project.baseDir});
    
    URL pathCapacityPlanningGeneral =
            RunCapacityPlanning.class.getResource("paramsGeneral.txt");
    File file = new File(pathCapacityPlanningGeneral.toString());
    if (!file.exists()) {
        System.out.println("File Do not exist");
        System.out.println(pathCapacityPlanningGeneral.toString());
    }
    

    以上 mvn 软件包后 java -cp 目标/容量计划-1.0-SNAPSHOT.jar com.moga.planning.RunCapacityPlanning 抛出:

    File Do not exist
    jar:file:/C:/Users/.../capacityplan/target/capacityplan-1.0-SNAPSHOT.jar!/com/moga/planning/paramsGeneral.txt
    

    有人知道我在这个方法中做错了什么吗?

    非常感谢。

共有1个答案

罗翔
2023-03-14

这里的视点栏目是:
资源是使用类路径解析的,而不是沿着您的项目目录布局。这意味着资源解析从下面开始
src/[main|test]/[java|资源]/

解析资源的最佳方式是通过

new File(getClass()
          .getResource("the resource relative path")
          .toURI()) 

这样,资源位于普通目录或jar中并不重要。

“资源相对路径”可以以< code>/开头。在这种情况下,它相对于类路径根进行解析。如果它不是以< code>/开头,则相对于当前包进行解析。

在您的示例中,文件夹planning就是您想要的,您可以使用

// from package "planning" one level up
new File(getClass()
            .getResource("../plannung")
            .toURI()) 

或者

// from CLASSPATH root decending
new File(getClass()
            .getResource("/com/moga/plannung")
            .toURI()) 

总是在路径名中使用正斜杠(/)。Java在窗口上也能正确处理它们。

 类似资料:
  • 问题内容: 如果使用绝对路径,则无法将整个目录移动到新位置。如果使用相对路径,则无法将单个文件移动到新位置。 这里有什么解决方案?您是否设置了一个包含根路径并从那里开始的配置文件?还是您有类似的规则:永不移动文件? 我在某些项目中看到人们使用dirname( FILE )。我的意思是,为什么不简单地将其删除,因为目录名还是相对的(取决于文件所在的位置)? 问题答案: 您应该使用一个配置文件,该配置

  • 最佳路径,是求解网络中两点之间阻抗最小的路经,必须按照结点的选择顺序访问网络中的结点。“阻抗最小”有多种理解,如基于单因素考虑的时间最短、费用最低、风景最好、路况最佳、过桥最少、收费站最少、经过乡村最多等。 下面以长春数据为例,计算地图中将要行走的地点间的最佳路径。其接口使用方法如下: 设置最佳路径分析参数 findPathParameter,包括交通网络分析通用参数、途径站点等; //设置网络分

  • 主要内容:什么是当前工作目录,什么是绝对路径与相对路径,Python处理绝对路径和相对路径在介绍绝对路径和相对路径之前,先要了解一下什么是当前工作目录。 什么是当前工作目录 每个运行在计算机上的程序,都有一个“当前工作目录”(或 cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。 注意,虽然文件夹是目录的更新的名称,但当前工作目录(或当前目录)是标准术语,没有当前工作文件夹这种说法。 在 Python 中,利用 os.getcwd() 函数可以取得当前工作路径的字

  • 在 Linux 中,简单的理解一个文件的路径,指的就是该文件存放的位置,例如,在《 Linux文件系统的层次结构》中提到的 /home/cat 就表示的是 cat 文件所存放的位置。只要我们告诉 Linux 系统某个文件存放的准确位置,那么它就可以找到这个文件。 指明一个文件存放的位置,有 2 种方法,分别是使用 绝对路径和 相对路径。 我们知道,Linux 系统中所有的文件(目录)都被组织成以根

  • 位置路径指定XML文档中节点的位置。路径可以是绝对路径或相对路径。 如果位置路径以选择的节点开始,则它是相对路径。 以下是使用相对路径定位元素的几个示例。 - 选择与节点相关的名字。 示例 在这个例子中,我们创建了一个示例XML文档students.xml,及其样式表文档students.xsl,它使用了XPath表达式。 以下是使用的示例XML。文件:students.xml - 文件:stud

  • 问题内容: 我在应用程序中使用Log4j。放置在classpath中的Jar中。该配置文件正在使用中,并且在大多数情况下都可以正常工作。 但是有时,生成的日志记录语句与配置文件不同。 我的理解是,这是因为属性文件是从类路径中获取的。不管第一个属性文件是什么,都由log4j获取和使用。因此,有时我们得到的日志记录语句与属性文件中配置的语句不同。 如果上述原因属实,那么我认为,我们需要通过以下方式之一