2017-07-31 3 views
0

J'ai écrit un programme pour obtenir le numéro de version d'un paquet. Et cela a bien fonctionné dans Intellij. Mais lorsque j'ai exécuté ce fichier jar en ligne de commande, la valeur de retour était null.Pourquoi getPackage(). GetSpecificationVersion() retourne null dans la ligne de commande

Mon projet 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> 

Ce projet ne contient qu'une seule classe: obtenir le numéro de version

package com.client.version; 

public class ClientVersion { 
    public ClientVersion() { 
    } 

public static String getCurrentVersion() { 
    return ClientVersion.class.getPackage().getSpecificationVersion(); 
    } 
} 

J'ai créé un autre projet

<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> 

et appelée méthode getCurrentVersion.

public class test { 

    public static void main(String[] args) { 
     System.out.println(ClientVersion.getCurrentVersion()); 
    } 
} 

Lorsque j'ai couru ce programme en IntelliJ, la sortie était 1.0. Mais lorsque j'ai empaqueté un fichier jar et exécuté cette méthode principale dans la ligne de commande java -cp target/test-version-1.0-SNAPSHOT.jar test.test, la sortie est null, pourquoi?.

Répondre

0

Cela se produit en raison du classloader. Intellij exécute tout dans non état emballé. Dans l'autre cas, vous avez empaqueté le fichier, puis vous voulez obtenir des informations sans classpath, donc vous obtenez null.