从 POM 文件中获取 artifactId 出错
Fetching artifactId from POM file gone wrong
为了在我的项目中获取 artifactId,我使用了以下代码。
public static void main(String[] args) {
Properties prop = new Properties();
InputStream in = null;
try {
String fileName = "application.properties";
in = ConfigServiceApplication.class.getClassLoader().getResourceAsStream(fileName);
prop.load(in);
SpringApplication.run(ConfigServiceApplication.class, args);
System.out.println(prop.getProperty("prop.name");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的 application.properties 包含以下内容:
prop.name=${project.artifactId}
如果一切 运行 正确,预期输出为:
config-service //this is my artifactId
但是当我 运行 上面的代码时我得到的输出是
${project.artifactId}
我已参考这些链接来获取信息:Retrieve version from maven pom.xml in code,
http://www.mkyong.com/java/java-properties-file-examples/
任何人都可以更正我的代码以正确获取 artifactId 吗?
编辑:
Pom 文件:
<project>
...
<artifactId>config-service</artifactId>
...
<properties>
<name>${project.artifactId}</name>
</properties>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
...
</project>
我认为您的目录结构或您 运行 代码的方式存在问题,因为配置看起来没问题。
看下面的小例子
# assumed structure
pom.xml
src/main/java/sub/optimal/mvnproperties/Main.java
src/main/resources/application.properties
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sub.optimal</groupId>
<artifactId>config-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
src/main/java/sub/optimal/mvnproperties/Main.java
package sub.optimal.mvnproperties;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
String fileName = "application.properties";
ClassLoader classLoader = Main.class.getClassLoader();
try (InputStream in = classLoader.getResourceAsStream(fileName)) {
// add check if the stream is open
Properties prop = new Properties();
prop.load(in);
prop.entrySet().stream().forEach((entry) -> {
System.out.printf("%s:%s%n", entry.getKey(), entry.getValue());
});
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
}
src/main/resources/application.属性
prop.name=${project.artifactId}
application.name=${pom.name}
现在编译执行
mvn clean compile
mvn exec:java -Dexec.mainClass=sub.optimal.mvnproperties.Main
或
mvn clean package
java -cp target/config-service-1.0-SNAPSHOT.jar sub.optimal.mvnproperties.Main
两种情况下属性的输出都是
prop.name:config-service
application.name:config-service
为了在我的项目中获取 artifactId,我使用了以下代码。
public static void main(String[] args) {
Properties prop = new Properties();
InputStream in = null;
try {
String fileName = "application.properties";
in = ConfigServiceApplication.class.getClassLoader().getResourceAsStream(fileName);
prop.load(in);
SpringApplication.run(ConfigServiceApplication.class, args);
System.out.println(prop.getProperty("prop.name");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的 application.properties 包含以下内容:
prop.name=${project.artifactId}
如果一切 运行 正确,预期输出为:
config-service //this is my artifactId
但是当我 运行 上面的代码时我得到的输出是
${project.artifactId}
我已参考这些链接来获取信息:Retrieve version from maven pom.xml in code, http://www.mkyong.com/java/java-properties-file-examples/
任何人都可以更正我的代码以正确获取 artifactId 吗?
编辑: Pom 文件:
<project>
...
<artifactId>config-service</artifactId>
...
<properties>
<name>${project.artifactId}</name>
</properties>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
...
</project>
我认为您的目录结构或您 运行 代码的方式存在问题,因为配置看起来没问题。
看下面的小例子
# assumed structure
pom.xml
src/main/java/sub/optimal/mvnproperties/Main.java
src/main/resources/application.properties
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sub.optimal</groupId>
<artifactId>config-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
src/main/java/sub/optimal/mvnproperties/Main.java
package sub.optimal.mvnproperties;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
String fileName = "application.properties";
ClassLoader classLoader = Main.class.getClassLoader();
try (InputStream in = classLoader.getResourceAsStream(fileName)) {
// add check if the stream is open
Properties prop = new Properties();
prop.load(in);
prop.entrySet().stream().forEach((entry) -> {
System.out.printf("%s:%s%n", entry.getKey(), entry.getValue());
});
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}
}
src/main/resources/application.属性
prop.name=${project.artifactId}
application.name=${pom.name}
现在编译执行
mvn clean compile
mvn exec:java -Dexec.mainClass=sub.optimal.mvnproperties.Main
或
mvn clean package
java -cp target/config-service-1.0-SNAPSHOT.jar sub.optimal.mvnproperties.Main
两种情况下属性的输出都是
prop.name:config-service
application.name:config-service