这是一个非Spring应用程序。这是一个简单的java应用程序,有一个main。我使用Lombok@Slf4j和log4j2.xml配置文件。Gradle构建文件包含以下内容:
dependencies {
...
implementation 'org.slf4j:slf4j-api:2.0.7'
implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0'
...
}
configurations {
testImplementation.extendsFrom compileOnly
// excludes transitive dependencies
implementation.transitive = false
}
jar {
dependsOn check
duplicatesStrategy = DuplicatesStrategy.FAIL
configurations.implementation.setCanBeResolved(true)
into('META-INF/lib') {
from (configurations.implementation)
}
manifest {
attributes("Spring-Context": "*;publish-context:=false")
attributes(
'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' '),
'Main-Class': 'com.example.Application'
)
}
}
日志在IntelliJ中运行时工作正常。作为可执行jar文件运行:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at dia.nmec.twm.s3_client_plugin.S3ClientPlugin.<clinit>(S3ClientPlugin.java:10)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
建议?
TIA,Eric
1条答案
按热度按时间nhaq1z211#
因此,要包含的库是以下...
我的问题是build. gradle。例如,将所有必要的jar文件放在META-INF/lib中,并不会将jar文件添加到类路径中。事实上,就我所知,将jar文件复制到META-INF/lib对于可执行的jar文件来说是非常无用的。
在build.gradle的'jar'部分中的以下行将获取jar文件并将其分解到根目录,然后将所有内容都震动起来(称为'fat'或'uber' jar文件)。
这为我解决了一切。
我所希望的是能够将所有jar文件添加到META-INF/lib中(在jar任务中,删除上面的'from'任务)...
然后将“Class-Path”添加到MANIFEST中,如下所示...
这样META-INF/lib中的所有jar文件都在类路径上并且可以被找到。
如果有人有建议,我很想听听这是否可行。