我编写了一个程序来获取软件包的版本号。它在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文件并在命令行中运行这个主要方法时
java -cp target/test-version-1.0-SNAPSHOT.jar test.test,输出为null,为什么?

最佳答案

那是由于classloader造成的。 Intellij以非打包状态运行所有内容。在另一种情况下,您打包文件,然后想要获取一些没有classpath的信息,因此您将获得null。

07-24 09:46
查看更多