【Azure Developer】記錄一次使用Java Azure Key Vault Secret示例代碼生成的Jar包,單獨運行出現 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 錯誤消息
- 2022 年 7 月 4 日
- 筆記
- 【Azure Developer】, 【Azure 環境】, Azure Developer, Azure Key Vault, Azure 環境, mvn package assembly:single, no main manifest attribute, in target/demo.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函數所在的位置
示例中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]