You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Scala与Java混合Maven项目并从Java调用Scala方法

Hey,我帮你捋捋Scala+Java混合Maven项目的坑!之前我也踩过不少,结合你提到的场景,给你整理几个关键的配置和排查点:

核心POM配置修正要点

混合编译的关键是让Maven正确处理Scala和Java代码的编译顺序,以及依赖关联:

  • 必须引入scala-maven-plugin插件
    这个插件是混合编译的核心,它能同时处理Scala和Java代码,并且保证Scala代码先被编译(因为Java编译器无法识别Scala语法,但Scala编译器兼容Java)。给你一个经过验证的配置:

    <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>4.8.1</version> <!-- 建议用最新稳定版,兼容Scala 2.12+/3.x -->
        <executions>
            <execution>
                <id>scala-compile</id>
                <phase>process-resources</phase> <!-- 确保在Java编译前执行 -->
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
            <execution>
                <id>scala-test-compile</id>
                <phase>process-test-resources</phase>
                <goals>
                    <goal>testCompile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
  • 匹配Scala依赖版本
    一定要保证Scala库的版本和插件兼容,比如插件4.x对应Scala 2.12及以上,添加依赖:

    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.13.12</version> <!-- 和你使用的Scala版本完全一致 -->
        <scope>compile</scope>
    </dependency>
    
  • 规范目录结构
    严格遵循Maven默认结构:

    • Java代码放在 src/main/java
    • Scala代码放在 src/main/scala
      插件会自动识别这两个目录的代码,不需要额外配置路径。
Java调用Scala方法的常见报错排查

如果已经配置了上面的内容还是报错,大概率是代码层面的问题:

  • 找不到Scala类/方法

    • Scala默认的类和方法是包私有,要让Java能调用,显式声明public(虽然Scala里写public class是冗余操作,但能避免编译阶段的识别问题)
    • 如果调用的是Scala伴生对象的方法,要确保方法是def而非private def,Java里直接用ScalaObj.methodName()调用即可,比如:
      // Scala代码
      package com.example
      object ScalaUtils {
        def getMessage(): String = "Hello from Scala Object!"
      }
      
      // Java代码
      String msg = com.example.ScalaUtils.getMessage();
      
  • 编译顺序冲突
    如果还是出现Java代码先编译导致找不到Scala类的情况,可以禁用maven-compiler-plugin的默认编译,让scala-maven-plugin全权处理混合编译:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <executions>
            <execution>
                <id>default-compile</id>
                <phase>none</phase>
            </execution>
        </executions>
    </plugin>
    
  • 版本兼容性问题
    确保Java版本和Scala版本匹配:

    • Scala 2.13 支持 Java 8+
    • Scala 3 支持 Java 11+
      在maven-compiler-plugin里指定对应的source/target版本:
    <configuration>
        <source>11</source>
        <target>11</target>
        <encoding>UTF-8</encoding>
    </configuration>
    
快速验证步骤
  1. 执行 mvn clean compile 检查编译是否通过
  2. 写一个最简测试用例:
    • Scala类:src/main/scala/com/example/ScalaService.scala
      package com.example
      public class ScalaService {
        def sayHello(name: String): String = s"Hello, $name from Scala!"
      }
      
    • Java类:src/main/java/com/example/JavaApp.java
      package com.example;
      public class JavaApp {
          public static void main(String[] args) {
              ScalaService service = new ScalaService();
              System.out.println(service.sayHello("Java"));
          }
      }
      
  3. 运行测试:mvn exec:java -Dexec.mainClass="com.example.JavaApp",如果正常输出结果就说明配置没问题了。

内容的提问来源于stack exchange,提问作者user1788485

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:41:09