Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JAR中为命令行项目注入带有Maven的存根脚本_Java_Maven - Fatal编程技术网

Java 在JAR中为命令行项目注入带有Maven的存根脚本

Java 在JAR中为命令行项目注入带有Maven的存根脚本,java,maven,Java,Maven,使用“本机”ApacheMaven插件,在jar文件的开头插入脚本以使jar成为可执行文件,更简单的方法是什么 实际上,任何将构建的jar文件作为常规文件进行“编辑”的方法都可以将其与另一个文件连接起来。如下面的shellcat示例: $ cat ${projectRoot}/src/main/stubs/runstub.sh target/${builtJarPath} > target/${builtJarPathWithoutExtention}-autorun.jar $ chmo

使用“本机”ApacheMaven插件,在jar文件的开头插入脚本以使jar成为可执行文件,更简单的方法是什么

实际上,任何将构建的jar文件作为常规文件进行“编辑”的方法都可以将其与另一个文件连接起来。如下面的shell
cat
示例:

$ cat ${projectRoot}/src/main/stubs/runstub.sh target/${builtJarPath} > target/${builtJarPathWithoutExtention}-autorun.jar
$ chmod +x target/${builtJarPathWithoutExtention}-autorun.jar
如果您想知道在jar文件开头插入shell脚本的原因,请查看internet上关于“将jar文件转换为Linux可执行文件”的信息,例如:


您可以使用
execmaven插件

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution>
      <id>Inject stub</id>
      <phase>install</phase> <!-- Select a phase that is after package generation -->
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/scripts/inject-stub.sh</executable>
      </configuration>
    </execution>
  </executions>
</plugin>

execmaven插件
org.codehaus.mojo
注入存根
安装
执行官
${basedir}/scripts/inject-stub.sh

在jar中使用shell脚本不会使其成为可执行文件。可执行文件首先需要MANIFEST.MF文件中mainClass中的一个正确条目,这使它能够启动jar,如
java-jar jarfile.jar
..@khmarbaise:MANIFEST文件不重要,脚本将启动JVM,项目所需的参数是否有任何MANIFEST文件。如果脚本不依赖清单文件,则清单文件不是必需的。因此,如果您向其中注入适当的脚本,它将是可执行的。我们更应该关心依赖任何脚本“运行程序”的缺点,例如:
sh
bash
zsh
,甚至
python
。。。在特定的操作系统中。我知道您不会被迫使用MANIFEST.MF等。如果考虑到操作系统的独立性,shell脚本是没有意义的。我知道您可以通过脚本启动jvm,也可以不通过脚本启动jvm。。。但是如何开始脚本呢?或者如何启动脚本,因为如果脚本在jar中,您就无法启动它。。。你可以通过Graal VM创建一个可执行文件,它可以编译成本地可执行文件,但我不知道你有什么样的应用程序。。。通常,您为linux创建两个不同的脚本
.cmd
(windows)和
.sh
,并创建一个包含所需一切的zip/tar.gz存档…(JVM不包括在内)您可以通过JLink(JDK9+)创建一个打包的JVM,并以同样的方式分发整个JRE,包括您的应用程序。。。但是你必须模块化。。。。