我正在尝试以编程方式创建一个fat-jar。到目前为止,我设法创建了一个Jar文件,里面有我的代码。问题是,如果我运行这个,我会收到一个异常,写着Cannot load user class: org.company.bla.bla
。
这是我的代码
private static void createJar() throws IOException {
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
JarOutputStream target = new JarOutputStream(new FileOutputStream("events.jar"), manifest);
Path root = Paths.get(".").normalize().toAbsolutePath();
System.out.println(root.toString());
Files.walk(root).forEach(f -> add(f.toFile(), target));
target.close();
}
private static void add(File source, JarOutputStream target)
{
BufferedInputStream in = null;
try {
if (source.isDirectory()) {
String name = source.getPath().replace("\\", "/");
if (!name.isEmpty()) {
if (!name.endsWith("/"))
name += "/";
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
}
for (File nestedFile: source.listFiles())
add(nestedFile, target);
return;
}
JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if (count == -1)
break;
target.write(buffer, 0, count);
}
target.closeEntry();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我如何将依赖项也添加到这个Jar?或者依赖项所在的路径在哪里,以便我可以包含它们?
1条答案
按热度按时间h6my8fg21#
创建一个Uber / Shadow对象意味着Maven或Gradle也可以用来处理所有的库依赖关系。
如果是这样,一个解决方案是从Java运行Maven或Gradle构建命令行arg(使用
Runtime.exec()
命令)。以编程方式执行此操作的一个用例是作为Java集成测试的一部分,其中需要Uber Jar(参见Testing custom Kafka Connect SMT using Test Containers的示例)。
以下解决方案同时支持Gradle / Maven。
Maven
确保
pom.xml
包含Maven Shade Plugin插件,例如:在项目中安装Maven wrapper也很有用(例如,运行
mvn wrapper:wrapper
)。要测试,请运行
./mvnw package
....并确保文件存在于
target
文件夹中:请注意,较大的文件(
helloworld-1.0.jar
)是Uber Jar。Gradle
对于Gradle,我们应该确保Gradle Shadow插件存在于
build.gradle
文件的plugins
部分,例如:还有
settings.gradle
另外,Gradle wrapper(例如,运行
gradle wrapper
)。要测试,请运行
./gradlew shadowJar
......并确保文件存在于
build/libs
文件夹中:使用Java创建Jar文件
创建UberJars的代码如下:
测试这两种情况的单元测试如下: