publish / publishLocal和编译/包之间在访问修饰符处理上的区别

时间:2019-11-30 23:53:03

标签: java scala sbt private-members

通常,Java不尊重Scala软件包private访问修饰符。这意味着Bar

package foo.bar

private[bar] case class Bar(x: String)
可以从Foo

访问

package foo;

import foo.bar.Bar;

public class Foo {
  public static Bar bar() {
    return new Bar("bar");
  }
}

我创建了一个具有以下结构的简单软件包:

.
├── build.sbt
├── project
│   └── build.properties
└── src
    └── main
        ├── java
        │   └── foo
        │       └── Foo.java
        └── scala
            └── foo
                └── bar
                    └── Bar.scala

build.sbt如下所示:

scalaVersion := "2.12.10"

可以对其进行编译(sbt compile和打包(sbt package),并且可以从另一个项目中调用Foo.bar

但是在publish / publishLocal上失败:

sbt publishLocal
[info] Loading project definition from /path/to/source/project
[info] Loading settings for project simpleapp from build.sbt ...
[info] Set current project to simpleapp (in build file:/path/to/)
[info] Main Scala API documentation to /path/to/source/target/scala-2.12/api...
[info] Wrote /path/to/source/target/scala-2.12/simpleapp_2.12-0.1.0-SNAPSHOT.pom
[error] /path/to/source/src/main/java/foo/Foo.java:6:17: not found: type Bar
[error]   public static Bar bar() {
[error]                 ^
[info] No documentation generated with unsuccessful compiler run
[error] one error found
[error] (Compile / doc) Scaladoc generation failed
[error] Total time: 1 s, completed Dec 1, 2019, 12:30:30 AM

我想知道是否有人可以解释这种不一致之处,并且在这种情况下是否存在一些解决方法来制作publishLocal

如果相关,我使用:

  • SBT 1.3.4
  • OpenJDK 11.0.5

我知道整件事都闻到了一英里远的气味,现在我完全可以了。

0 个答案:

没有答案