From 1024102d9a79a94642f7d4f4d09dd63758f3edb8 Mon Sep 17 00:00:00 2001 From: enpy Date: Sun, 24 Jun 2018 18:57:24 +0200 Subject: [PATCH] BAEL-1733 (#4417) * BAEL-1733 * naming conventions settled * createManifestFile method added * remove accidentally created MANIFEST.MF file from the project root flder --- .../com/baeldung/manifest/AppExample.java | 8 ++ .../com/baeldung/manifest/ExecuteJarFile.java | 83 +++++++++++++++++++ .../manifest/ExecuteJarFileUnitTest.java | 24 ++++++ 3 files changed, 115 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/manifest/AppExample.java create mode 100644 core-java/src/main/java/com/baeldung/manifest/ExecuteJarFile.java create mode 100644 core-java/src/test/java/com/baeldung/manifest/ExecuteJarFileUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/manifest/AppExample.java b/core-java/src/main/java/com/baeldung/manifest/AppExample.java new file mode 100644 index 0000000000..cb15323b22 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/manifest/AppExample.java @@ -0,0 +1,8 @@ +package com.baeldung.manifest; + +public class AppExample { + + public static void main(String[] args){ + System.out.println("AppExample executed!"); + } +} diff --git a/core-java/src/main/java/com/baeldung/manifest/ExecuteJarFile.java b/core-java/src/main/java/com/baeldung/manifest/ExecuteJarFile.java new file mode 100644 index 0000000000..21e14b96e0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/manifest/ExecuteJarFile.java @@ -0,0 +1,83 @@ +package com.baeldung.manifest; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; + +public class ExecuteJarFile { + + private static final String DELIMITER = " "; + private static final String WORK_PATH = "src/main/java/com/baeldung/manifest"; + private static final String MANIFEST_MF_PATH = WORK_PATH + "/MANIFEST.MF"; + private static final String MAIN_MANIFEST_ATTRIBUTE = "Main-Class: com.baeldung.manifest.AppExample"; + + private static final String COMPILE_COMMAND = "javac -d . AppExample.java"; + private static final String CREATE_JAR_WITHOUT_MF_ATT_COMMAND = "jar cvf example.jar com/baeldung/manifest/AppExample.class"; + private static final String CREATE_JAR_WITH_MF_ATT_COMMAND = "jar cvmf MANIFEST.MF example.jar com/baeldung/manifest/AppExample.class"; + private static final String EXECUTE_JAR_COMMAND = "java -jar example.jar"; + + public static void main(String[] args) { + System.out.println(executeJarWithoutManifestAttribute()); + System.out.println(executeJarWithManifestAttribute()); + } + + public static String executeJarWithoutManifestAttribute() { + return executeJar(CREATE_JAR_WITHOUT_MF_ATT_COMMAND); + } + + public static String executeJarWithManifestAttribute() { + createManifestFile(); + return executeJar(CREATE_JAR_WITH_MF_ATT_COMMAND); + } + + private static void createManifestFile() { + BufferedWriter writer; + try { + writer = new BufferedWriter(new FileWriter(MANIFEST_MF_PATH)); + writer.write(MAIN_MANIFEST_ATTRIBUTE); + writer.newLine(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static String executeJar(String createJarCommand) { + executeCommand(COMPILE_COMMAND); + executeCommand(createJarCommand); + return executeCommand(EXECUTE_JAR_COMMAND); + } + + private static String executeCommand(String command) { + String output = null; + try { + output = collectOutput(runProcess(command)); + } catch (Exception ex) { + System.out.println(ex); + } + return output; + } + + private static String collectOutput(Process process) throws IOException { + StringBuffer output = new StringBuffer(); + BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line = ""; + while ((line = outputReader.readLine()) != null) { + output.append(line + "\n"); + } + return output.toString(); + } + + private static Process runProcess(String command) throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder(command.split(DELIMITER)); + builder.directory(new File(WORK_PATH).getAbsoluteFile()); + builder.redirectErrorStream(true); + Process process = builder.start(); + process.waitFor(); + return process; + } + +} diff --git a/core-java/src/test/java/com/baeldung/manifest/ExecuteJarFileUnitTest.java b/core-java/src/test/java/com/baeldung/manifest/ExecuteJarFileUnitTest.java new file mode 100644 index 0000000000..a5a499c98c --- /dev/null +++ b/core-java/src/test/java/com/baeldung/manifest/ExecuteJarFileUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.manifest; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class ExecuteJarFileUnitTest { + + private static final String ERROR_MESSAGE = "no main manifest attribute, in example.jar\n"; + private static final String SUCCESS_MESSAGE = "AppExample executed!\n"; + + @Test + public final void givenDefaultManifest_whenManifestAttributeIsNotPresent_thenGetErrorMessage() { + String output = ExecuteJarFile.executeJarWithoutManifestAttribute(); + assertEquals(ERROR_MESSAGE, output); + } + + @Test + public final void givenCustomManifest_whenManifestAttributeIsPresent_thenGetSuccessMessage() { + String output = ExecuteJarFile.executeJarWithManifestAttribute(); + assertEquals(SUCCESS_MESSAGE, output); + } + +}