为什么getPackage()。getSpecificationVersion()在命令行中返回null

时间:2017-07-31 11:46:41

标签: java maven classloader

我写了一个程序来获取软件包的版本号。它在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,为什么?。

1 个答案:

答案 0 :(得分:0)

这是由于类加载器引起的。 Intellij以打包状态运行所有内容。在另一种情况下,你打包文件,然后想要获得一些没有类路径的信息,所以你得到null。