我正在用Gradle构建一个jar文件。该jar文件被用作另一个项目中的库。但是,当项目尝试使用jar文件时,将返回ClassNotFoundException。
const obj = {a: 1, b: { c: 2, d: { template: 'Date: <now>'}}};
const deepMap = (fn, xs) =>
mapObjIndexed(
(val, key, obj) =>
or(is(Array, val), is(Object, val))
? deepMap(fn, fn(val))
: fn(val),
xs
);
const checkFn = ({ template }) => template;
const transformFn = (val, key) => {
const interpolated = val.template.replace('<now>', Date.now())
console.log(interpolated);
return interpolated;
};
const mapFn = n =>
checkFn(n)
? transformFn(n)
: n;
console.clear();
deepMap(mapFn, obj);
>> {"a": 1, "b": {"c": 2, "d": {}}}
我已经在构建jar的gradle文件中包含了jwt库:
Caused by: java.lang.NoClassDefFoundError: com/auth0/jwt/JWT
使用jar的项目似乎无法在jar中找到此jar依赖项。
我用gradle命令构建了jar:
compile group: 'com.auth0', name: 'java-jwt', version: '3.4.0'
如何在jar中包含缺少的依赖项?
答案 0 :(得分:1)
通常,您不应将依赖项打包在已发布的JAR中。最好在pom.xml
中将它们声明为依赖项,然后让您的用户JAR提取它们。只是一个好习惯就足够了。
如果还不够,请使用Gradle Shadow:
plugins {
id 'com.github.johnrengelman.shadow' version '4.0.2'
}
在这种情况下,使用shadowJar
任务会生成Fat JAR。发布也很容易:
publishing {
publications {
shadow(MavenPublication) { publication ->
project.shadow.component(publication)
}
}
repositories {
maven {
url "http://your.repo"
}
}
}