首页 > 解决方案 > 是否可以使用 Java 和 kotlin 来创建 Spring Boot 应用程序?

问题描述

我一直在尝试使用带有 Java 和 Koltin 的 Maven 构建一个 Spring Boot 应用程序。没有错误,什么都没有,但是在运行它时它只是说 NoDefClassException 并且没有找到我的异常,我的存储库,基本上任何来自 kotlin 的东西。这是我的 pom.xml 插件

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                 <configuration>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                    </compilerPlugins>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
                 <executions>
                    <execution>
                        <id>compile</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <groupId>com.microsoft.azure</groupId>
                <artifactId>azure-webapp-maven-plugin</artifactId>
                <version>1.9.1</version>
                <configuration>
                    <schemaVersion>V2</schemaVersion>
                    <resourceGroup>media-services</resourceGroup>
                    <appName>companysystemservices</appName>
                    <pricingTier>F1</pricingTier>
                    <region>westeurope</region>
                    <runtime>
                        <os>linux</os>
                        <javaVersion>java11</javaVersion>
                        <webContainer>java11</webContainer>
                    </runtime>
                    <deployment>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/target</directory>
                                <includes>
                                    <include>*.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </deployment>
                </configuration>
            </plugin>
        </plugins>
    </build>

我怎样才能让他们在这里编译和运行所有东西?

编辑:我的包资源管理器是这样的:

src/main/java
   com.company
       annotations
       config
       controllers
       daos
       dtos
       model
       services
       utils
       CompanyApp.java

模型中有 3 个 kotlin,第一个包含 10 个异常,第二个 12 个存储库和最后 3 个 sql 投影作为数据类。

看到这就是我的意思,这些课程在 kotlin bin 上,似乎工作得很好,但不会引导 JPA。 是的,我检查了存储库注释

我还添加了一个 CommandLineRunner 并试图抛出一个异常,得到了这个:

java.lang.NoClassDefFoundError: com/company/model/BadRequest400Exception
    at com.company.CompanyApplication.run(CompanyApplication.java:20) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:779) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at com.company.CompanyApplication.main(CompanyApplication.java:15) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.4.RELEASE.jar:2.3.4.RELEASE]
Caused by: java.lang.ClassNotFoundException: com.company.model.BadRequest400Exception
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
    at java.base/java.lang.Class.forName(Class.java:398) ~[na:na]
    at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:144) ~[spring-boot-devtools-2.3.4.RELEASE.jar:2.3.4.RELEASE]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    ... 12 common frames omitted

我试图在本地的eclipse上运行它,它在intellij上运行良好。但是日食是免费的,所以我更喜欢日食,但似乎无法让它发挥作用。

标签: javaspringspring-bootkotlin

解决方案


对的,这是可能的。据我在您的项目结构中看到的,您在 java 源代码下有 Kotlin 代码。我将这种方法与 gradle 和 IntelliJ 一起使用,但它应该与 eclipse 和 maven 一起使用。例如,如果您有

src/main/java
   com.company
       config
           JavaConfig.java
           KotlinConfig.kt

您需要将 java 和 Kotlin 源代码分开。

src/main/java
   com.company
       config
           JavaConfig.java
src/main/kotlin
   com.company
       config
           KotlinConfig.kt

推荐阅读