如何将 lib 中的 jars 包含到 Netbeans 8.2 中的项目 jar 文件中?
How to include jars in lib into project jar file in Netbeans 8.2?
当我构建 jar 文件时,它会创建一个单独的文件夹 lib,但由于我可以将所有内容合并到一个文件中,所以我看到了如何操作 here,但在这个新版本中( 8.2) 它不起作用,因为站点菜单已更改,当我添加 build.xml 时,我无法右键单击 > 运行 目标,因为它 "blocks" 元素
目标是只有一个文件,为了更方便而且不必移动自动生成的文件夹 lib。项目类型是 Java Application 我没有修改 build.xml
中的任何内容
选项一
假设您有:(a) 一个标准的基于 Ant 的项目(听起来您有),以及 (b) 您在通常的 NetBeans "Libraries" 文件夹中有额外的 JAR 文件,那么您可以执行以下操作:
1) 编辑项目的 build.xml
文件。
2) 转到文件末尾,并在最后的 </project>
标记之前添加以下内容:
<target name="-post-jar">
<jar destfile="${dist.jar}"
update="true">
<restrict>
<archives>
<zips>
<fileset dir="${dist.dir}" includes="lib/*.jar"/>
</zips>
</archives>
</restrict>
</jar>
</target>
这为 NetBeans 中的标准 "clean and build" 进程增加了一个额外的步骤。
它将库文件的内容复制到应用程序的 JAR 文件中。请注意,我在这里明确地说 "the contents" 。它不会自己复制 JAR 文件 - 因为您必须处理由该方法引起的 class 路径问题(请参阅选项 2)。它只是将库 JAR 中的所有 class 文件复制到应用程序的 JAR 中。
以上内容基于在 Ant 文档中找到的示例 here。请参阅 "Merging archives" 示例。
然后,您可以 运行 像这样的 JAR 文件:
"C:\Program Files\Java\jdk1.8.0_211\bin\java" -jar C:\tmp\DemoOne.jar
选项二
为您的构建过程(和 JAR 依赖项管理)使用 Maven,而不是 Ant。具体细节超出了这个问题的范围,但请寻找 Maven Shade 插件。
该插件专门设计用于处理您问题中的情况 - 以及处理我上面的选项 1 可能无法处理的更复杂的情况。使用 Maven 管理您的依赖 JAR 也可以让您的生活变得更加轻松。
其他注意事项
拥有一个包含所需库 JAR 的单独 "lib" 目录可能会让人感觉不方便(即便携性较差),但从保持代码分离(在其自己的 JAR 中)的角度来看,它确实有意义来自其他库和依赖项。
NetBeans 8.2 于 2016 年 10 月发布 - 它(按照 IDE 的标准)已经很老了。如果可以的话,您可能需要考虑升级到更高版本。有关最新版本的列表,请参阅 here。
使用更新版本的 NetBeans,您将能够更轻松地利用更新版本的 Java。
编辑 - Maven Shade
这是一个基于 Maven 的示例(使用 Java 11),以防它鼓励您再看看 Maven。
这是 Java 程序:
package org.ajames.uberjar;
import org.apache.commons.lang3.CharUtils;
public class App {
public static void main(String[] args) {
System.out.println("The result is " + CharUtils.isAscii('x') + "!");
}
}
如您所见,非常简单。它需要一个外部 JAR 文件:commons-lang3
.
当您选择创建一个新的基于 Maven 的 Java 项目时,NetBeans 会为您创建一个 Maven POM 文件 (pom.xml)。
您必须编辑该 POM 文件。这是我的,它创建了一个包含我需要的一切的可执行 JAR:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ajames</groupId>
<artifactId>UberJarExample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
</dependencies>
<build>
<finalName>UberJarExample</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Built-By>ajames</Built-By>
<Main-Class>org.ajames.uberjar.App</Main-Class>
<Build-Number>123</Build-Number>
<!-- https://planet.jboss.org/post/building_multi_release_jars_with_maven -->
<Multi-Release>false</Multi-Release>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
当我构建 jar 文件时,它会创建一个单独的文件夹 lib,但由于我可以将所有内容合并到一个文件中,所以我看到了如何操作 here,但在这个新版本中( 8.2) 它不起作用,因为站点菜单已更改,当我添加 build.xml 时,我无法右键单击 > 运行 目标,因为它 "blocks" 元素
目标是只有一个文件,为了更方便而且不必移动自动生成的文件夹 lib。项目类型是 Java Application 我没有修改 build.xml
中的任何内容选项一
假设您有:(a) 一个标准的基于 Ant 的项目(听起来您有),以及 (b) 您在通常的 NetBeans "Libraries" 文件夹中有额外的 JAR 文件,那么您可以执行以下操作:
1) 编辑项目的 build.xml
文件。
2) 转到文件末尾,并在最后的 </project>
标记之前添加以下内容:
<target name="-post-jar">
<jar destfile="${dist.jar}"
update="true">
<restrict>
<archives>
<zips>
<fileset dir="${dist.dir}" includes="lib/*.jar"/>
</zips>
</archives>
</restrict>
</jar>
</target>
这为 NetBeans 中的标准 "clean and build" 进程增加了一个额外的步骤。
它将库文件的内容复制到应用程序的 JAR 文件中。请注意,我在这里明确地说 "the contents" 。它不会自己复制 JAR 文件 - 因为您必须处理由该方法引起的 class 路径问题(请参阅选项 2)。它只是将库 JAR 中的所有 class 文件复制到应用程序的 JAR 中。
以上内容基于在 Ant 文档中找到的示例 here。请参阅 "Merging archives" 示例。
然后,您可以 运行 像这样的 JAR 文件:
"C:\Program Files\Java\jdk1.8.0_211\bin\java" -jar C:\tmp\DemoOne.jar
选项二
为您的构建过程(和 JAR 依赖项管理)使用 Maven,而不是 Ant。具体细节超出了这个问题的范围,但请寻找 Maven Shade 插件。
该插件专门设计用于处理您问题中的情况 - 以及处理我上面的选项 1 可能无法处理的更复杂的情况。使用 Maven 管理您的依赖 JAR 也可以让您的生活变得更加轻松。
其他注意事项
拥有一个包含所需库 JAR 的单独 "lib" 目录可能会让人感觉不方便(即便携性较差),但从保持代码分离(在其自己的 JAR 中)的角度来看,它确实有意义来自其他库和依赖项。
NetBeans 8.2 于 2016 年 10 月发布 - 它(按照 IDE 的标准)已经很老了。如果可以的话,您可能需要考虑升级到更高版本。有关最新版本的列表,请参阅 here。
使用更新版本的 NetBeans,您将能够更轻松地利用更新版本的 Java。
编辑 - Maven Shade
这是一个基于 Maven 的示例(使用 Java 11),以防它鼓励您再看看 Maven。
这是 Java 程序:
package org.ajames.uberjar;
import org.apache.commons.lang3.CharUtils;
public class App {
public static void main(String[] args) {
System.out.println("The result is " + CharUtils.isAscii('x') + "!");
}
}
如您所见,非常简单。它需要一个外部 JAR 文件:commons-lang3
.
当您选择创建一个新的基于 Maven 的 Java 项目时,NetBeans 会为您创建一个 Maven POM 文件 (pom.xml)。
您必须编辑该 POM 文件。这是我的,它创建了一个包含我需要的一切的可执行 JAR:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ajames</groupId>
<artifactId>UberJarExample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
</dependencies>
<build>
<finalName>UberJarExample</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Built-By>ajames</Built-By>
<Main-Class>org.ajames.uberjar.App</Main-Class>
<Build-Number>123</Build-Number>
<!-- https://planet.jboss.org/post/building_multi_release_jars_with_maven -->
<Multi-Release>false</Multi-Release>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>