­

【Azure Developer】記錄一次使用Java Azure Key Vault Secret示例代碼生成的Jar包,單獨運行出現 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 錯誤消息

問題描述

創建一個Java Console程序,用於使用Azure Key Vault Secret。在VS Code中能正常Debug,但是通過mvn clean package打包為jar文件後,使用 java -jar target/demo-1.0-SNAPSHOT.jar 卻出現 no main manifest attribute問題。

VS Code中Debug的截圖:

java -jar target/demo-1.0-SNAPSHOT.jar 運行錯誤截圖:

PS C:\LBWorkSpace\MyCode\57-KeyVault-java\demo> java -jar target/demo-1.0-SNAPSHOT.jar
no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar

 

問題解決

問題的原因就是因為通過 mvn package打包的時候,沒有添加manifest。可以通過修改 pom.xml文件中的 build 部分的內容,指定mainClass的值為當前項目中main函數所在的位置

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.5</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.kvsecretstest.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

示例中main函數主體:

package com.example.kvsecretstest;

import com.azure.identity.AzureAuthorityHosts;
import com.azure.identity.DefaultAzureCredentialBuilder;

import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;

/**
 * Hello world!
 *
 */
public class App {
        public static void main(String[] args) throws InterruptedException {
                System.out.println("Hello World!");
String keyVaultUri = "//xxxxxxxxxxxxx.vault.azure.cn/"; System.out.printf("key vault name = xxxxxxxxx and key vault URI = %s \n", keyVaultUri); String userIdentityID = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; SecretClient secretClientidentity = new SecretClientBuilder() .vaultUrl(keyVaultUri) .credential(new DefaultAzureCredentialBuilder().managedIdentityClientId(userIdentityID) .authorityHost(AzureAuthorityHosts.AZURE_CHINA) .build()) .buildClient(); String secretName = "ExamplePassword"; KeyVaultSecret retrievedSecret = secretClientidentity.getSecret(secretName); System.out.println("Your secret's value is '" + retrievedSecret.getValue() + "'."); System.out.println("done."); } }

修改完POM.XML文件後,先mvn clean清理所有已經生成的target文件。

然後使用新的打包命令: mvn package assembly:single, 生成一個包含所有依賴項目的jar包。

 

然後通過java -jar 命令運行 java -jar target\demo-1.0-SNAPSHOT-jar-with-dependencies.jar

運行成功,解決no main manifest attribute 問題!

 

 

附錄一:完整版的Pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.kvsecretstest</groupId>
  <artifactId>demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>demo</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-security-keyvault-secrets</artifactId>
      <version>4.2.3</version>
    </dependency>

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.5</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.kvsecretstest.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

 

參考資料

適用於 Java 的 Azure Key Vault 機密客戶端庫//docs.azure.cn/zh-cn/key-vault/secrets/quick-create-java?tabs=azure-cli

Maven生成可以直接運行的jar包的多種方式//xxgblog.com/2015/08/07/maven-create-executable-jar/

 

 

[END]