选项一
假设您有:(a) 一个标准的基于 Ant 的项目(听起来像您有),并且 (b) 您在通常的 NetBeans“库”文件夹中有额外的 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 中的标准“清理和构建”过程增加了一个额外的步骤。
它将库文件的内容复制到应用程序的 JAR 文件中。请注意,我在这里明确地说“内容”。它不会复制 JAR 文件本身 - 因为您必须处理由该方法引起的类路径问题(请参阅选项 2)。它只是将库 JAR 中的所有类文件复制到应用程序的 JAR 中。
以上内容基于 Ant 文档中的 here 示例。请参阅“合并档案”示例。
然后,您可以使用以下内容运行 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 阴影
这是一个基于 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>