您的位置:

使用maven设置相对路径的正确姿势

一、什么是相对路径?

首先在介绍如何使用maven设置相对路径之前,我们需要先清楚什么是相对路径。相对路径是相对于当前文件路径的表示,即在不同的目录下我们可以使用相对路径来访问同一份文件。

比如我们有一个项目结构如下:

|
|--- src/
|    |--- main/
|    |    |--- java/
|    |    |--- resources/
|    |    |    |--- properties/
|    |    |    |    |--- db.properties
|    |    |--- webapp/
|    |         |--- WEB-INF/
|    |              |--- jsp/
|    |                   |--- login.jsp
|    |                   |--- index.jsp

我们在login.jsp中想要引用db.properties文件,如果我们使用绝对路径,就需要写成:

<%@ page import="java.util.Properties" %>
<%@ page import="java.io.FileInputStream" %>
<% 
   String path = request.getSession().getServletContext().getRealPath("/WEB-INF/classes/properties/db.properties");
   Properties props = new Properties();
   FileInputStream in = new FileInputStream(path);
   props.load(in);
   String url = props.getProperty("url");
   String username = props.getProperty("username");
   String password = props.getProperty("password");
   in.close();
%>

但是如果我们使用相对路径,就可以写成:

<%@ page import="java.util.Properties" %>
<%@ page import="java.io.FileInputStream" %>
<% 
   String path = request.getSession().getServletContext().getRealPath("/WEB-INF/classes/properties/db.properties");
   Properties props = new Properties();
   FileInputStream in = new FileInputStream(path);
   props.load(in);
   String url = props.getProperty("url");
   String username = props.getProperty("username");
   String password = props.getProperty("password");
   in.close();
%>

二、如何使用maven设置相对路径?

Maven是Java开发中使用最广泛的自动化构建工具之一。在使用Maven构建项目时,我们可以使用${project.basedir}来表示项目的根目录,这样就可以避免手动指定绝对路径的麻烦。以下是一些示例。

三、使用相对路径指定src文件夹下文件的位置

在Maven项目开发中,除了在webapp目录下的文件,我们还可能会在src/main/java、src/main/resources或者src/test/java中需要调用其他资源文件,这时使用相对路径就很方便。

1.设置log4j.properties位置

假如我们的log4j.properties文件在src/main/resources目录下,它的内容如下:

# 日志输出级别
log4j.rootLogger=INFO, stdout
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{1}:%L - %m%n

在pom.xml文件中,我们可以添加以下配置:

<project>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>log4j.properties</include>
                </includes>
                <targetPath>../classes</targetPath>
            </resource>
        </resources>
    </build>
</project>

使用Maven命令来构建项目:mvn clean package,在target目录下会生成一个classes文件夹。其中log4j.properties文件就会出现在classes下了。

2.使用相对路径设置dubbo.properties位置

同样道理,我们还可以使用相对路径来设置dubbo.properties文件的位置。

<project>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>dubbo.properties</include>
                </includes>
                <targetPath>../classes</targetPath>
            </resource>
        </resources>
    </build>
</project>

这样一来,在src/main/resources目录下创建dubbo.properties文件就可以被正常引用了。

四、使用相对路径指定webapp下文件的位置

1.使用相对路径指定jsp文件的位置

在web应用中,最常用的就是jsp文件了。假如我们的index.jsp和login.jsp都在webapp/jsp目录下,而我们的css文件都在webapp/css文件夹下。

|
|--- src/
|    |--- main/
|    |--- webapp/
|    |    |--- css/
|    |    |    |--- style.css
|    |    |--- jsp/
|    |         |--- login.jsp
|    |         |--- index.jsp

在index.jsp中想要使用css文件,我们可以这样写:

<link rel="stylesheet" type="text/css" href="../css/style.css">

这里的../表示返回上一级目录,也就是从webapp/jsp返回到webapp下。

另外,在我们的login.jsp中想要引用某些js库的话,可以这样写:

<script src="../js/jquery.min.js"></script>

2.使用相对路径指定web.xml文件的位置

我们知道,web.xml是web应用的配置文件,我们可以配置拦截器、servlet、监听器等等。在web.xml中,我们有时需要引用其他文件,这时候使用相对路径就可以避免绝对路径的麻烦。

例如,我们要在web.xml中引用spring配置文件,可以这样写:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:../spring/applicationContext.xml
        classpath:../spring/spring-mybatis.xml
    </param-value>
</context-param>

总结

相对路径在项目中应用广泛,而maven的出现为我们的开发过程提供了便利。在使用Maven构建项目时,我们可以使用${project.basedir}来避免手动指定绝对路径的麻烦,使用相对路径既方便又实用。