java - user.dir 在 Intellij IDEA 中没有正确解析

标签 java spring maven intellij-idea spring-boot

我在 Spring Boot 中使用了 @Value 注释,但它似乎并没有像我预期的那样完全工作。

在我的@Configuration 文件中:

@Value("${installationDirectory}")
private File m_installationDirectory;

在我的 application.properties 中:

installationDirectory=${user.dir}/install

启动:

public static void main( String[] args ) throws IOException
{
    logger.info( "Starting application" );
    logger.info( "Java version: {}", System.getProperty( "java.version" ) );
    logger.info( "Java home   : {}", System.getProperty( "java.home" ) );
    logger.info( "Operation System: {} {} ({})", System.getProperty( "os.name" ), System.getProperty( "os.version" ), System.getProperty( "os.arch" ) );
    logger.info( "Working dir : {}", System.getProperty( "user.dir" ) );

    SpringApplication springApplication = new SpringApplication( Main.class );
    springApplication.setShowBanner( false );
    ConfigurableApplicationContext context = springApplication.run( args );
}

启动时的输出:

2014-05-14 09:36:05 INFO [main] Main - Starting application
2014-05-14 09:36:05 INFO [main] Main - Java version: 1.7.0_55
2014-05-14 09:36:05 INFO [main] Main - Java home   : /Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home/jre
2014-05-14 09:36:05 INFO [main] Main - Operation System: Mac OS X 10.9.2 (x86_64)
2014-05-14 09:36:05 INFO [main] Main - Working dir : /Users/wdb/Work/netty-test
2014-05-14 09:36:05 INFO [main] Main - Starting Main on bruk-00007-l.zone2.flir.net with PID 98296 (/Users/wdb/Work/netty-test/flux-server/flux-server-application/target/classes started by wdb)
2014-05-14 09:36:05 DEBUG [main] Main - Running with Spring Boot v1.0.1.RELEASE, Spring v4.0.3.RELEASE
2014-05-14 09:36:08 INFO [main] LoggingToFileMessageRepositoryDecorator - Storing messages in /Users/wdb/Library/Caches/IntelliJIdea13/compile-server/install/messages
2014-05-14 09:36:08 INFO [main] OnDiskSingleJvmImageRepository - Storing images in folder /Users/wdb/Library/Caches/IntelliJIdea13/compile-server/install/images
2014-05-14 09:36:08 INFO [main] TrafficDataIntegratorsManagerImpl - Created 3 integrators for 1 sources in 1 ms
2014-05-14 09:36:09 INFO [main] Main - Started Main in 3.928 seconds (JVM running for 4.428)

注意系统属性 user.dir 指向 /Users/wdb/Work/netty-test 如果我只是打印它。但是,在将 installationDirectory 值注入(inject) Spring bean 的地方,路径似乎是 /Users/wdb/Library/Caches/IntelliJIdea13/compile-server/install/预期的 /Users/wdb/Work/netty-test/install

请注意,我是从 IntelliJ 13.1.2 运行的,在我的运行配置中“工作目录”设置为 /Users/wdb/Work/netty-test

最佳答案

我发现了问题。我正在使用 Maven 进行构建。 spring-boot-starter-parent 默认为 application.properties 启用资源过滤:

<!-- Turn on filtering by default for application properties -->
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/application.yml</include>
            <include>**/application.properties</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>**/application.yml</exclude>
            <exclude>**/application.properties</exclude>
        </excludes>
    </resource>
</resources>

看来 ${user.dir} 也是 Maven 将要替换的东西。如果我查看 target/classes 中的 application.properties,它确实被替换了。

要修复,我需要执行以下操作:

首先告诉Maven你想要escape filtering :

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>2.6</version>
  <configuration>
    <escapeString>\</escapeString>
  </configuration>
</plugin>

然后将 application.properties 文件更改为:

installationDirectory=\${user.dir}/install

在此之后,一切正常。

关于java - user.dir 在 Intellij IDEA 中没有正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23648667/

相关文章:

java - jboss 7.1项目部署类未找到

java - 在不放弃 SNAPSHOT 限定符的情况下想要 Artifact 可追溯性

java - 在 Airflow 中设置 DB2

java - eBay 交易 API getOrders : check if order is marked as shipped

java - 根据视频长度倒计时器

java - NetBeans java.lang.ClassNotFoundException

java - 使用名称模拟身份验证

java - 如何通过 Spring MVC 将工作线程的响应发布到客户端?

java.lang.NoSuchMethodError : org. springframework.core.annotation.AnnotationUtils.clearCache()V

java - 使用 Tycho 在同一项目中进行源代码和测试源代码