我写了一个程序来获取软件包的版本号。它在Intellij中运作良好。但是当我在命令行中运行这个jar文件时,返回值为null。
我的maven项目
<groupId>com.client.version</groupId>
<artifactId>version-specification</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Build-Number>${project.version}</Build-Number>
<Timestamp>yyyy-MM-dd HH:mm:ss</Timestamp>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
此项目只包含一个类:获取版本号
package com.client.version;
public class ClientVersion {
public ClientVersion() {
}
public static String getCurrentVersion() {
return ClientVersion.class.getPackage().getSpecificationVersion();
}
}
我创建了另一个项目
<groupId>com.client.test</groupId>
<artifactId>test-version</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.client.version</groupId>
<artifactId>version-specification</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
并调用getCurrentVersion
方法。
public class test {
public static void main(String[] args) {
System.out.println(ClientVersion.getCurrentVersion());
}
}
当我在IntelliJ中运行此程序时,输出为1.0
。
但是当我打包一个jar文件并在命令行中运行这个main方法时
java -cp target/test-version-1.0-SNAPSHOT.jar test.test
,输出为null
,为什么?。
答案 0 :(得分:0)
这是由于类加载器引起的。 Intellij以非打包状态运行所有内容。在另一种情况下,你打包文件,然后想要获得一些没有类路径的信息,所以你得到null。