How to Debug NoClassDefFoundError (Gradle, Kotlin) - intellij-idea

With my kotlin project at Runtime I get the following error:
java.lang.NoClassDefFoundError: com/julianjarecki/latextemplates/lib/jtwig/RequireNodeParser
at com.julianjarecki.latextemplates.lib.jtwig.RequireNodeParserProvider.<init>(RequireNodeParserProvider.kt:8)
at com.julianjarecki.latextemplates.lib.jtwig.RequireExtension.configure(RequireExtension.kt:11)
at org.jtwig.environment.EnvironmentFactory.create(EnvironmentFactory.java:60)
at com.julianjarecki.latextemplates.lib.jtwig.LatexTemplate.getLatexRequireEnvironment(LatexParser.kt:76)
at com.julianjarecki.latextemplates.lib.jtwig.LatexTemplate.access$getLatexRequireEnvironment$p(LatexParser.kt:68)
at com.julianjarecki.latextemplates.lib.jtwig.LatexTemplate$template$2.invoke(LatexParser.kt:73)
at com.julianjarecki.latextemplates.lib.jtwig.LatexTemplate$template$2.invoke(LatexParser.kt:68)
at com.julianjarecki.latextemplates.lib.UpdatableLazy.getValue(UpdatableLazy.kt:17)
at com.julianjarecki.latextemplates.lib.jtwig.LatexTemplate.getTemplate(LatexParser.kt)
at com.julianjarecki.latextemplates.view.MainView$root$1$4$1$1$2.invoke(MainView.kt:133)
at com.julianjarecki.latextemplates.view.MainView$root$1$4$1$1$2.invoke(MainView.kt:35)
at tornadofx.NodesKt$onDoubleClick$1.handle(Nodes.kt:484)
at tornadofx.NodesKt$onDoubleClick$1.handle(Nodes.kt)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
Indeed, when I look into my buil folder, RequireNodeParser.class is not where it is supposed to be.
The class is referenced in RequireNodeParserProvider like this:
package com.julianjarecki.latextemplates.lib.jtwig
import org.jtwig.parser.addon.AddonParserProvider
import org.jtwig.parser.parboiled.node.AddonParser
import com.julianjarecki.latextemplates.lib.jtwig.RequireNodeParser
class RequireNodeParserProvider : AddonParserProvider {
override fun keywords(): MutableCollection<String> = mutableListOf(RequireKeywords.REQUIRE.token)
override fun parser(): Class<out AddonParser> = RequireNodeParser::class.java
}
How do I even start debugging this Problem?
Edit 1 (Stacktrace of the ClassNotFoundException cause):

Related

KotlinJs: Unable to run jsBrowserTest in Google Cloudbuild due to "ReferenceError: setMetadataFor is not defined"

We have a very simple test in kotlinJs to check that a function we have in Javascript is read into kotlin and returns something:
JS code:
function: makeKey = (num) => { return 1000 + num }
Kotlin FFI code:
#JsNonModule
external object MyApp {
fun makeKey(num: Int): Int
}
Test Code:
class TestFFI {
#Test
fun thingsShouldWork() {
println(MyApp.makeKey(5))
assertNotNull(MyApp.makeKey(5))
assertEquals(1005, MyApp.makeKey(5))
}
}
This works locally but when we put this into a google cloud run we get the following failure: ReferenceError: setMetadataFor is not defined
setMetadataFor appears to be a function in the testJs file that is produced by the kotlin compiler and is defined as
var setMetadataFor = kotlin_kotlin.$_$.t9;
We are wondering if the Kotlin code is getting packaged wrong and not including the relevant file
We are using Kotlin 1.8 and Gradle 7.4.

Why is the kotlin-gradle-plugin failing to create a PSIFile from CodeInsightTestFixture.configureByText?

I created an IntelliJ plugin using the template https://github.com/JetBrains/intellij-platform-plugin-template. The template comes with a test that runs on an XML file. I want to create a similar test for a Kotlin file. Here's the template test file plus my added test (test2):
package org.jetbrains.plugins.template
import com.intellij.ide.highlighter.XmlFileType
import com.intellij.psi.xml.XmlFile
import com.intellij.testFramework.TestDataPath
import com.intellij.testFramework.fixtures.BasePlatformTestCase
import com.intellij.util.PsiErrorElementUtil
#TestDataPath("\$CONTENT_ROOT/src/test/testData")
class MyPluginTest : BasePlatformTestCase() {
fun testXMLFile() {
val psiFile = myFixture.configureByText(XmlFileType.INSTANCE, "<foo>bar</foo>")
val xmlFile = assertInstanceOf(psiFile, XmlFile::class.java)
assertFalse(PsiErrorElementUtil.hasErrors(project, xmlFile.virtualFile))
assertNotNull(xmlFile.rootTag)
xmlFile.rootTag?.let {
assertEquals("foo", it.name)
assertEquals("bar", it.value.text)
}
}
override fun getTestDataPath() = "src/test/testData/rename"
fun testRename() {
myFixture.testRename("foo.xml", "foo_after.xml", "a2")
}
// Here's my test
fun test2() {
val fileText: String = """
package com.loganmay.test
data class MyClass(val myString: String)
""".trimIndent()
val psiFile = myFixture.configureByText("a.kt", fileText)
val xmlFile = assertInstanceOf(psiFile, XmlFile::class.java)
}
}
Without changing the build.gradle file, that test fails with:
Expected instance of: com.intellij.psi.xml.XmlFile actual: com.intellij.psi.impl.source.PsiPlainTextFileImpl
I want it to parse the text as a PsiFile that's also a KtFile. From various sources, I've been led to believe that the fixture is parsing it as a plain text file because the test project doesn't have access to the Kotlin compiler. So, I added:
dependencies {
testImplementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10")
}
to the build.gradle. Then, when I run the test, configureByText throws an exception with a big trace, the root exception of which is:
Caused by: java.lang.Throwable: 'filetype.archive.display.name' is not found in java.util.PropertyResourceBundle#4ecbb519(messages.CoreBundle)
... 53 more
org.jetbrains.plugins.template.MyPluginTest > test2 FAILED
com.intellij.diagnostic.PluginException at ComponentManagerImpl.kt:511
Caused by: java.util.MissingResourceException at Registry.java:164
Does anyone have any insight into what the issue is or know how to resolve it?
Notes:
I also tried importing the kotlin compiler and casting psiFile as KtFile, which produced the same error, an idea I got from here
This project has a test like this that may be working
This post and this post recommend adding the kotlin gradle plugin, which I did
This question seems similar
Yann Cebron replied on the jetbrains help forum with an answer for Java, which also worked for Kotlin.
The solution is to add a dependency to the IntelliJ gradle plugin. The template comes with these lines in the build.gradle:
intellij {
pluginName.set(properties("pluginName"))
version.set(properties("platformVersion"))
type.set(properties("platformType"))
// Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.
plugins.set(properties("platformPlugins").split(',').map(String::trim).filter(String::isNotEmpty))
}
So, didn't need to do anything there. In my gradle.properties, I added
platformPlugins = com.intellij.java, org.jetbrains.kotlin
To my plugin.xml, I added:
<depends>com.intellij.modules.java</depends>
<depends>org.jetbrains.kotlin</depends>
I was able to remove
dependencies {
testImplementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10")
}
from the build.gradle which I mentioned above.
Now, the test works for Java and Kotlin files.

import kotlinx is impossible in IntelliJ IDEA

I`m testing coroutine example code on IntelliJ IDEA. But I cannot import library which needs for coroutine.
I created project as Kotlin - "JVM | IDEA". I tried simple print hello world code and succeesfully done. But coroutine example don`t even execute.
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
fun main()
{
runBlocking {
var counter = 0
val lock = Mutex()
val coroutines = List(3) {
launch {
repeat(1_000) {
lock.withLock {
counter++
}
}
}
}
coroutines.forEach { it.join() }
println("Final counter: $counter")
}
}
This Code runs on https://play.kotlinlang.org. But in IDEA, they cannot understand it, showing 'Unresolved reference'.
I`ve searched but no answer found. How can I run this on IDEA project?
it would be a good idea to switch to a Gradle-based build, which will automatically be imported by IntelliJ IDEA.
you can set IntelliJ to automatically stay in sync with your Gradle files, or you can opt to "sync" IntelliJ to Gradle's structure on demand.
you have two syntax options with Gradle: Groovy and Kotlin. make sure if you are new to Gradle that you use a consistent syntax, otherwise it can be hard to follow the guides. obviously if you are working in Kotlin, it's a great idea to use Kotlin in your build files, too.

Kotlin/Native Tensorflow

I created a tensorflow library and trying get tensorflow version in my kotlin script like that
import tensorflow.TF_Version
fun main(args: Array<String>) {
TF_Version()
}
idea can link TF_Version() method to library with Ctrl+click
and there(in library) i have method
fun TF_Version(): CPointer<ByteVar>? {
return interpretCPointer<ByteVar>(kniBridge0())
}
#SymbolName("tensorflow_kniBridge0")
private external fun kniBridge0(): NativePtr
but when i try to build and start i see this error
/tmp/konan_temp8584442034275821874/combined.o:ld-temp.o:function Konan_start: error: undefined reference to 'tensorflow_kniBridge0'
error: /home/fnasibov/.konan/dependencies/target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu/bin/ld.gold invocation reported errors
Please help me fix that
Found solution:
my .def file was
headers = /home/user/.konan/third--arty/tensorflow/include/tensorflow/c/c_api.h
And after i add Opts to def file:
headers = /home/fnasibov/.konan/third-party/tensorflow/include/tensorflow/c/c_api.h
compilerOpts.linux = -I/usr/include -I/usr/include/x86_64-linux-gnu
linkerOpts.linux = -L/home/user/.konan/third-party/tensorflow/lib -ltensorflow
and regenerate klib - thats worked!

Cucumber JVM cannot find the steps defined

When I run to run this test with a feature it complains it cannot find the steps. I have tried defining them in Java 8 style, and Java 7 style and using IntelliJ to generate the steps into a MyStepdefs class but it cannot find them.
I am using version 1.2.4 of cucumber-java8 and cucumber-junit.
import cucumber.api.CucumberOptions;
import cucumber.api.DataTable;
import cucumber.api.PendingException;
import cucumber.api.java8.En;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;
#RunWith(Cucumber.class)
#CucumberOptions(
monochrome = true,
glue = {"com.mycom.core.agg.RunCukesTest"})
public class RunCukesTest implements En {
public RunCukesTest() {
Given("^I have PriceLevels$", (DataTable arg1) -> {
});
And("^I have a TradeRequest$", (DataTable arg1) -> {
});
Then("^I should get these LegRequests$", (DataTable arg1) -> {
});
}
}
running the test prints
Running com.mycom.core.agg.RunCukesTest
1 Scenarios (1 undefined)
3 Steps (3 undefined)
0m0.000s
You can implement missing steps with the snippets below:
Given("^I have PriceLevels$", (DataTable arg1) -> {
.. rest deleted ...
Running the feature file from IntelliJ give much the same error.
While we couldn't figure out what the cause was, create a new maven project with a minimum of dependencies "fixed" the problem. We didn't need to change the code.