如何在不使用 PlantUML 图代码的情况下使用 Java API 创建 PlantUML 图?

How to create PlantUML diagram using Java API without using PlantUML diagram code?

在我的 Java 应用程序中,我想使用 PlantUML 创建图表。我想在不使用 PlantUML 图代码的情况下使用它的 Java API 在 PlantUML 中创建图。不幸的是,互联网上缺少这方面的示例或文档,唯一记录的 API 是生成图 from diagram code as string 的那个,这对我没有帮助。 PlantUML中有什么API可以用这种方式创建图表?

在我看来,PlantUML 并不是设计成以这种方式使用的:API 没有记录。话虽如此,它是一个开源项目,因此您可以下载源代码并跟踪给定 UML 字符串的执行,然后如果您需要的话,可以通过避免使用 UML 源代码的方法调用重新创建该执行。如果你有一个可以单步执行第三方代码的调试器,比如 IntelliJ,那将会很有帮助。

我做了一点尝试。这是一个 class,它将使用 Java API 生成“Bob -> Alice : hello”图表,而无需通过 UML 源字符串。我包含了 UML 字符串版本以供比较:

import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import static com.google.common.base.Preconditions.checkState;

public class PlantUMLDemoMain {
    public static void main(String[] args) throws Exception {
        generateFromStringSource(new File("from-string.png"));
        generateFromApi(new File("from-api.png"));
    }

    private static void generateFromApi(File file) throws IOException {
        // 1. setup:
        SequenceDiagramFactory f = new SequenceDiagramFactory();
        SequenceDiagram diagram = f.createEmptyDiagram();

        // 2. Build the diagram:
        // "Bob -> Alice : hello"
        // See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
        Display bobD = Display.getWithNewlines("Bob");
        Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);

        Display aliceD = Display.getWithNewlines("Alice");
        Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);

        Display label = Display.getWithNewlines("hello");
        ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();

        Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());

        checkState(null == diagram.addMessage(msg));

        // 3. Output the diagram
        // See net.sourceforge.plantuml.SourceStringReader#generateImage
        diagram.makeDiagramReady();
        checkState(1 == diagram.getNbImages());
        try (OutputStream os = new FileOutputStream(file)) {
            ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
            System.out.println("generateFromApi: " + diagram.getDescription().getDescription());
        }
    }

    private static void generateFromStringSource(File file) throws IOException {
        String source = "@startuml\n";
        source += "Bob -> Alice : hello\n";
        source += "@enduml\n";

        SourceStringReader reader = new SourceStringReader(source);
        // Write the first image to "png"
        String desc = reader.generateImage(file);
        // Return a null string if no generation
        System.out.println("generateFromStringSource: " + desc);
    }
}

这将使用这样的 build.sbt 文件构建:

libraryDependencies += "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies += "com.google.guava" % "guava" % "31.0.1-jre"

generateFromApi 的输出与 generateFromStringSource 相同,如下所示: