ClassNotFoundException с использованием библиотеки Spark через Bazel - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь запустить сервер "hello world" в Spark, собирая его с помощью Bazel, но получаю эту ошибку:

$ bazel run //:app
INFO: Analysed target //:app (0 packages loaded).
INFO: Found 1 target...
Target //:app up-to-date:
  bazel-bin/app.jar
  bazel-bin/app
INFO: Elapsed time: 0.201s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at spark.Service.<clinit>(Service.java:56)
        at spark.Spark$SingletonHolder.<clinit>(Spark.java:51)
        at spark.Spark.getInstance(Spark.java:55)
        at spark.Spark.<clinit>(Spark.java:61)
        at io.app.server.Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 5 more

BUILD:

java_binary(
    name = "app",
    main_class = "io.app.server.Main",
    srcs = ["src/main/java/io/app/server/Main.java"],
    deps = [
        "@org_slf4j_slf4j_simple//jar",
        "@com_sparkjava_spark_core//jar",
    ]
)

То же самоеошибка возникает, если я не включаю slf4j, и она не должна быть обязательной зависимостью от spark.

WORKSPACE:

maven_jar(
    name = "com_sparkjava_spark_core",
    artifact = "com.sparkjava:spark-core:2.7.2"
)

maven_jar(
    name = "org_slf4j_slf4j_simple",
    artifact = "org.slf4j:slf4j-simple:1.7.21"
)

И, наконец, src / main / java / io / app/server/Main.java:

package io.app.server;

import static spark.Spark.*;

public class Main {
  public static void main(String[] args) {
    port(3000);
    get("/", (req, res) -> "Hello World");
  }
}

Есть идеи о том, что я могу здесь делать неправильно?

1 Ответ

0 голосов
/ 25 июня 2018

Нашел то, что мне не хватало. Похоже, что maven_jar не извлекает автоматически «транзитивные зависимости», которые есть у самой библиотеки, см. .

Bazel только читает зависимости, перечисленные в вашем файле WORKSPACE. Если твой Проект (A) зависит от другого проекта (B), который перечисляет зависимость от третий проект (C) в своем файле WORKSPACE, вам нужно будет добавить оба B и C в файл WORKSPACE вашего проекта. Это требование может баллон размер файла WORKSPACE, но, надеюсь, ограничивает шансы одна библиотека включает C версии 1.0, а другая - C 2.0.

Большие файлы WORKSPACE могут быть созданы с помощью инструмента generate_workspace. Для получения дополнительной информации см. Генерация внешних зависимостей. из проектов Maven.

Таким образом, решение, похоже, состоит в том, чтобы написать pom.xml и использовать generate_workspace .

РЕДАКТИРОВАТЬ: generate_workspace устарела, вместо этого используйте bazel_deps .

...