MapDB ClassNotFoundException:kotlin.jvm.internal.Intrinsics
MapDB ClassNotFoundException: kotlin.jvm.internal.Intrinsics
我正在尝试 运行 一个简单的 mapdb 示例,但出现错误:
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at org.mapdb.DBMaker.fileDB(DBMaker.kt)
at leechies.Truc.main(Truc.java:9)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
我的class:
package leechies;
import java.util.concurrent.ConcurrentMap;
import org.mapdb.DB;
import org.mapdb.DBMaker;
public class Truc {
public static void main(String[] args) {
DB db = DBMaker.fileDB("file.db").make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
db.close();
}
}
我的pomx.xml
<dependencies>
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.3</version>
</dependency>
我 运行 右击 -> 运行 作为... -> java 应用程序。
它将失败,因为您的类路径中没有必要的 kotlin 运行time jar。你必须 运行 一些命令来解决这个错误。请参考此 link 命令:-
https://dzone.com/articles/exercises-in-kotlin-part-1-getting-started
也许 运行 你的 class 来自 maven,它会添加所有必要的依赖项。
run main class of Maven project
要么 kotlin-runtime
必须在 classpath
中并用 $ echo $CLASSPATH
验证。
或者你必须添加 kotlin-runtime
到 maven 然后 assemble 在 jar 本身里面 mvn compile assembly:single
,
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-runtime</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
这也需要附加到工件上,可以用 assembly-plugin
完成。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>event.handlers.InventoryEventHandler</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
您可以通过
验证 kotlin-runtime 是否已添加到 jar
$ jar -tf target/amz-wavelength-1.0-SNAPSHOT-jar-with-dependencies.jar | grep kotlin-runtime
META-INF/kotlin-runtime.kotlin_module
或
$ jar -tf target/amz-wavelength-1.0-SNAPSHOT-jar-with-dependencies.jar | grep "kotlin/jvm/internal/*"
@prayagupd 的回答对我有用。但我认为值得一提的是,另一种选择是使用 maven-shade-plugin instead of the maven-assembly-plugin(将其放入 pom.xml 文件的 build/plugins
部分):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
阴影插件很好,因为它允许您排除重复项 类。如果您必须使用任何一个插件,很高兴知道您不需要两者。在我的快速测试中,构建时间和生成的 jar 文件大小几乎相同,但是程序集插件(prayagupd 建议的)不会在我的构建输出中添加一堆警告,所以我继续这样做。
我正在尝试 运行 一个简单的 mapdb 示例,但出现错误:
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at org.mapdb.DBMaker.fileDB(DBMaker.kt)
at leechies.Truc.main(Truc.java:9)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
我的class:
package leechies;
import java.util.concurrent.ConcurrentMap;
import org.mapdb.DB;
import org.mapdb.DBMaker;
public class Truc {
public static void main(String[] args) {
DB db = DBMaker.fileDB("file.db").make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
db.close();
}
}
我的pomx.xml
<dependencies>
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.3</version>
</dependency>
我 运行 右击 -> 运行 作为... -> java 应用程序。
它将失败,因为您的类路径中没有必要的 kotlin 运行time jar。你必须 运行 一些命令来解决这个错误。请参考此 link 命令:-
https://dzone.com/articles/exercises-in-kotlin-part-1-getting-started
也许 运行 你的 class 来自 maven,它会添加所有必要的依赖项。
run main class of Maven project
要么 kotlin-runtime
必须在 classpath
中并用 $ echo $CLASSPATH
验证。
或者你必须添加 kotlin-runtime
到 maven 然后 assemble 在 jar 本身里面 mvn compile assembly:single
,
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-runtime</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.1.3</version>
<scope>compile</scope>
</dependency>
这也需要附加到工件上,可以用 assembly-plugin
完成。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>event.handlers.InventoryEventHandler</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
您可以通过
验证 kotlin-runtime 是否已添加到 jar$ jar -tf target/amz-wavelength-1.0-SNAPSHOT-jar-with-dependencies.jar | grep kotlin-runtime
META-INF/kotlin-runtime.kotlin_module
或
$ jar -tf target/amz-wavelength-1.0-SNAPSHOT-jar-with-dependencies.jar | grep "kotlin/jvm/internal/*"
@prayagupd 的回答对我有用。但我认为值得一提的是,另一种选择是使用 maven-shade-plugin instead of the maven-assembly-plugin(将其放入 pom.xml 文件的 build/plugins
部分):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
阴影插件很好,因为它允许您排除重复项 类。如果您必须使用任何一个插件,很高兴知道您不需要两者。在我的快速测试中,构建时间和生成的 jar 文件大小几乎相同,但是程序集插件(prayagupd 建议的)不会在我的构建输出中添加一堆警告,所以我继续这样做。