├── .gitignore ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .travis.yml ├── src └── main │ ├── resources │ └── README.txt │ └── java │ └── org │ └── binarybabel │ └── embedtool │ └── Main.java ├── gradlew.bat ├── README.md └── gradlew /.gitignore: -------------------------------------------------------------------------------- 1 | /.gradle 2 | /build 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/binarybabel/java-embed-tool/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: 3 | - oraclejdk7 4 | 5 | before_cache: 6 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 7 | - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ 8 | cache: 9 | directories: 10 | - $HOME/.gradle/caches/ 11 | - $HOME/.gradle/wrapper/ 12 | -------------------------------------------------------------------------------- /src/main/resources/README.txt: -------------------------------------------------------------------------------- 1 | 2 | - EMBEDDED CODE - 3 | 4 | This directory contains source code embedded/forked from other projects to preclude the 5 | need for separate bundling; prefixed class packages prevent naming conflicts with other 6 | instances of the same source code, in case the original library is installed. 7 | 8 | Code contained herein should be licensed such that it allows bundling/embedding without 9 | violating the copyright of the original source code's author(s). 10 | 11 | The source code for the original JAR should be added as a GIT sub-module under the REPO 12 | directory. After checking out the source code, you can use: 13 | ./embed-tool.jar MODULE_NAME SOURCE_PACKAGE DESTINATION_PACKAGE 14 | 15 | This will copy the prefixed classes, resources, and txt-notices to the JAVA directory. 16 | 17 | ========================================================================================= 18 | LIBRARY AUTHORS 19 | VERSION PACKAGE 20 | LICENSE WEBSITE 21 | ========================================================================================= 22 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Java Embed Tool 2 | 3 | [![Build Status](https://travis-ci.org/binarybabel/java-embed-tool.svg?branch=master)](https://travis-ci.org/binarybabel/java-embed-tool) 4 | 5 | `embed-tool` is designed to embed Java source-code in another project's namespace. **[Compiled releases are available on GitHub](https://github.com/binarybabel/java-embed-tool/releases).** 6 | 7 | Instructions and a deployment pattern using [Git Submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) and [Gradle](https://gradle.org/) are available below. This repository contains the source for the command-line executable. 8 | 9 | * Common use case is in creating single-jar plugins/addons for other pieces of software. 10 | * Removes the need for external runtime dependencies on other JARs. 11 | * Prevents version conflicts between components requiring a different version of the same dependency. 12 | 13 | Please be sure you are respecting the licenses of any source-code you embed in a project. There are legitimate use-cases for this method, and the deployment pattern below makes every effort maintain the chain of attribution for descendent projects. In using this tool you are responsible for all liabilities resulting in the final product. 14 | 15 | ## Getting Started 16 | 17 | These instructions assume the use of Gradle and a `src/main/java` base directory for your project's code. 18 | 19 | #### Inputs 20 | 21 | ``` 22 | $PROJECT_ROOT = Base directory for your project, containing 'src/main/java' 23 | $PROJECT_PACKAGE = Root package name for your project 24 | $EMBED_REPO = URL of repo containing source-code to embed 25 | $EMBED_NAME = Name/alias for embedded repo (letters & numbers only) 26 | $EMBED_PACKAGE = Root package name of embedded code 27 | ``` 28 | 29 | #### Installing embed-tool 30 | 31 | ``` 32 | cd $PROJECT_ROOT 33 | mkdir -p src/embed 34 | cd src/embed 35 | 36 | # Download embed-tool.jar from GitHub 37 | https://github.com/binarybabel/java-embed-tool/releases 38 | 39 | # Initialize workspace 40 | java -jar embed-tool.jar init 41 | ``` 42 | 43 | #### Update Gradle includes 44 | 45 | You will need to modify your `build.gradle` to include the embedded code, 46 | both for the compile and in the generated artifact. 47 | 48 | ``` 49 | sourceSets { 50 | embed 51 | main { 52 | compileClasspath += embed.output 53 | runtimeClasspath += embed.output 54 | } 55 | test { 56 | compileClasspath += embed.output 57 | runtimeClasspath += embed.output 58 | } 59 | } 60 | 61 | jar { 62 | from sourceSets.embed.output 63 | from sourceSets.main.output 64 | } 65 | 66 | javadoc { 67 | classpath = sourceSets.main.compileClasspath 68 | } 69 | ``` 70 | 71 | ## Using embed-tool 72 | 73 | Add embedded code as a git submodule 74 | 75 | ``` 76 | cd $PROJECT_ROOT/src/embed 77 | git submodule add $EMBED_REPO repo/$EMBED_NAME 78 | ``` 79 | 80 | Update `embed/README.txt` with the embed details. **Example:** 81 | 82 | ``` 83 | ========================================================================================= 84 | LIBRARY AUTHORS 85 | VERSION PACKAGE 86 | LICENSE WEBSITE 87 | ========================================================================================= 88 | 89 | solid-tx BinaryBabel OSS 90 | 0.0.1 org.binbab.solidtx 91 | MIT https://github.com/binarybabel/solid-tx 92 | ``` 93 | 94 | Run `embed-tool ` to add the embed code to your project's namespace 95 | 96 | ``` 97 | ./embed-tool.jar $EMBED_NAME $EMBED_PACKAGE $PROJECT_PACKAGE 98 | ``` 99 | 100 | The imported source code is now available as `$PROJECT_PACKAGE.embed.$EMBED_NAME` and the files 101 | under `src/embed` should be committed to source-control. The original (unembedded) source for 102 | each import will not be part of your project repo directly, but is referenceable as a git submodule. 103 | 104 | To update the embedded code in the future, perform a `git pull` within the `src/embed/repo/$EMBED_NAME` directory and then re-run the `embed-tool`. 105 | 106 | ## Author and License 107 | 108 | - **Author:** BinaryBabel OSS () 109 | - **License:** MIT 110 | 111 | ``` 112 | The MIT License (MIT) 113 | 114 | Permission is hereby granted, free of charge, to any person obtaining a copy 115 | of this software and associated documentation files (the "Software"), to deal 116 | in the Software without restriction, including without limitation the rights 117 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 118 | copies of the Software, and to permit persons to whom the Software is 119 | furnished to do so, subject to the following conditions: 120 | 121 | The above copyright notice and this permission notice shall be included in 122 | all copies or substantial portions of the Software. 123 | 124 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 125 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 126 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 127 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 128 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 129 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 130 | THE SOFTWARE. 131 | ``` 132 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn ( ) { 37 | echo "$*" 38 | } 39 | 40 | die ( ) { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 165 | if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then 166 | cd "$(dirname "$0")" 167 | fi 168 | 169 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 170 | -------------------------------------------------------------------------------- /src/main/java/org/binarybabel/embedtool/Main.java: -------------------------------------------------------------------------------- 1 | package org.binarybabel.embedtool; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | 5 | import java.io.*; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) { 10 | if (args.length == 1) { 11 | String cmd = args[0]; 12 | if (cmd.equalsIgnoreCase("init")) { 13 | logInfo("Initializing embed-tool workspace..."); 14 | File embedJavaBaseDir = new File("java"); 15 | if (!embedJavaBaseDir.exists()) { 16 | logFile(embedJavaBaseDir); 17 | embedJavaBaseDir.mkdir(); 18 | } 19 | File embedSourceBaseDir = new File("repo"); 20 | if (!embedSourceBaseDir.exists()) { 21 | logFile(embedSourceBaseDir); 22 | embedSourceBaseDir.mkdir(); 23 | } 24 | File readmeFile = new File("README.txt"); 25 | if (!readmeFile.exists()) { 26 | logFile(readmeFile); 27 | try { 28 | exportResource("/" + readmeFile.getName()); 29 | } catch (Exception e) { 30 | e.printStackTrace(); 31 | } 32 | } 33 | } else { 34 | printUsage(); 35 | } 36 | } else if (args.length == 3) { 37 | String slug = args[0]; 38 | String bc1 = args[1]; 39 | String bc2 = args[2]; 40 | 41 | String embedSourceClass = bc1; 42 | String embedTargetClass = bc2 + ".embed." + slug; 43 | 44 | File embedJavaBaseDir = new File("java"); 45 | File embedTargetJavaDir = new File(embedJavaBaseDir.getPath() + "/" + embedTargetClass.replace(".", "/")); 46 | 47 | File embedSourceDir = new File("repo/" + slug); 48 | File embedSourceMainJavaDir = new File(embedSourceDir.getPath() + "/src/main/java/" + embedSourceClass.replace(".", "/")); 49 | File embedSourceEmbedJavaDir = new File(embedSourceDir.getPath() + "/src/embed/java/" + embedSourceClass.replace(".", "/")); 50 | 51 | if (!embedSourceMainJavaDir.exists()) { 52 | throw new RuntimeException("Source java directory doesn't exist."); 53 | } 54 | 55 | if (!embedJavaBaseDir.exists()) { 56 | throw new RuntimeException("Embed java directory doesn't exist."); 57 | } 58 | 59 | logInfo("Embedding from:"); 60 | logInfo(" " + embedSourceClass); 61 | logInfo("Embedding to:"); 62 | logInfo(" " + embedTargetClass); 63 | 64 | try { 65 | 66 | logInfo("Prepping workspace..."); 67 | 68 | if (embedJavaBaseDir.exists()) { 69 | FileUtils.deleteDirectory(embedTargetJavaDir); 70 | } 71 | embedTargetJavaDir.mkdir(); 72 | 73 | logInfo("Copying text files..."); 74 | for (File f : embedSourceDir.listFiles()) { 75 | if (f.getName().matches(".*(\\.txt|\\.md)")) { 76 | File d = new File(embedTargetJavaDir.getPath() + "/" + f.getName()); 77 | logFile(d); 78 | FileUtils.copyFile(f, d, true); 79 | } 80 | } 81 | 82 | logInfo("Embedding java files..."); 83 | embedSourceDir(embedSourceMainJavaDir, embedTargetJavaDir, embedSourceClass, embedTargetClass); 84 | if (embedSourceEmbedJavaDir.exists()) { 85 | embedSourceDir(embedSourceEmbedJavaDir, embedTargetJavaDir, embedSourceClass, embedTargetClass); 86 | } 87 | 88 | } catch (IOException e) { 89 | e.printStackTrace(); 90 | } 91 | } else { 92 | printUsage(); 93 | } 94 | } 95 | 96 | private static void embedSourceDir(File sourceDir, File targetDir, CharSequence fromNamespace, CharSequence toNamespace) { 97 | targetDir.mkdirs(); 98 | 99 | for (File f : sourceDir.listFiles()) { 100 | if (f.getName().matches(".*(\\.java)")) { 101 | File d = new File(targetDir.getPath() + "/" + f.getName()); 102 | logFile(d); 103 | try { 104 | BufferedReader br = new BufferedReader(new FileReader(f)); 105 | BufferedWriter bw = new BufferedWriter(new FileWriter(d)); 106 | try { 107 | String line = br.readLine(); 108 | while (line != null) { 109 | bw.write(line.replace(fromNamespace, toNamespace) + "\n"); 110 | line = br.readLine(); 111 | } 112 | } finally { 113 | br.close(); 114 | bw.close(); 115 | } 116 | } catch (IOException e) { 117 | e.printStackTrace(); 118 | } 119 | } else if (f.isDirectory()) { 120 | embedSourceDir( 121 | new File(sourceDir.getPath() + "/" + f.getName()), 122 | new File(targetDir.getPath() + "/" + f.getName()), 123 | fromNamespace, 124 | toNamespace 125 | ); 126 | } 127 | } 128 | } 129 | 130 | private static void printUsage() { 131 | System.out.println("EMBED-TOOL USAGE:"); 132 | System.out.println("### Initialize workspace"); 133 | System.out.println(" embed-tool.jar init"); 134 | System.out.println("### Add original source as sub-module"); 135 | System.out.println(" git submodule add $REMOTE_URL repo/$LOCAL_NAME"); 136 | System.out.println("### Embed source to your project's namespace"); 137 | System.out.println(" embed-tool.jar $LOCAL_NAME $EMBED_PACKAGE $PROJECT_PACKAGE"); 138 | } 139 | 140 | private static void logInfo(String info) { 141 | System.out.println(info); 142 | } 143 | 144 | private static void logFile(File file) { 145 | System.out.println(" + " + file.getPath()); 146 | } 147 | 148 | private static void exportResource(String resourceName) throws Exception { 149 | InputStream streamIn = null; 150 | OutputStream streamOut = null; 151 | String jarFolder; 152 | try { 153 | streamIn = Main.class.getResourceAsStream(resourceName); 154 | if(streamIn == null) { 155 | throw new Exception("Cannot get resource \"" + resourceName + "\" from Jar file."); 156 | } 157 | 158 | int readBytes; 159 | byte[] buffer = new byte[4096]; 160 | jarFolder = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile().getPath().replace('\\', '/'); 161 | streamOut = new FileOutputStream(jarFolder + resourceName); 162 | while ((readBytes = streamIn.read(buffer)) > 0) { 163 | streamOut.write(buffer, 0, readBytes); 164 | } 165 | } catch (Exception e) { 166 | throw e; 167 | } finally { 168 | streamIn.close(); 169 | streamOut.close(); 170 | } 171 | } 172 | } 173 | --------------------------------------------------------------------------------