在Maven中编译Python源代码

时间:2018-10-12 02:09:05

标签: java python-3.x maven

我的项目中(在src/main/python下有一些python源文件,以及Java类(在src/main/java下)。我想将这些python文件包括到我的maven目标jar中。是否有插件可以做到这一点?

我可以看到IntelliJ创建的构建工件确实包含python文件,但是maven创建的构建文件不包含。

2 个答案:

答案 0 :(得分:0)

如前所述,您当前的项目结构在src/java中具有Java文件。这不符合Maven标准。理想情况下,您应该遵循标准结构,使与IDE和Maven的兼容性更简单。

Java文件应保存在要打包在jar中的src/main/java中。

简单地说,Python只是脚本文件,不是经过编译的。因此,您可以将这些文件放在src/main/resources中。

src
|---main
|   |---java (Keep your java files here)
|   |---resources
|   \    |---python (You can keep you python files here)
|        \
|---test
|   |---java (Keep your java unit test files here)
|   |---resources (If you have any resources test specific)
|   \

如果不可能,则需要更新pom.xml以确保将src/python视为源文件夹。请参阅此插件: build helper plugin

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/python</source>
                ...
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

答案 1 :(得分:0)

Python 不会编译成中间文件,而只是执行 .py 文件。 (就像 Node.js 执行 .js 文件一样。)

所以我们谈论的是包含和运行。

src/main/python 文件夹不是标准的,这意味着没有可以处理 python 文件的插件。您可以将其定义为

<build>
<resources>
    <resource>
        <directory>src/main/python</directory>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

资源只是复制到 jar 中。

从 Java 访问文件

    private static String SOURCE_FILE_NAME = "main.py";
    private static InputStream SOURCE_FILE_INPUT = YourClassName.class.getClassLoader().getResourceAsStream(SOURCE_FILE_NAME);

从 Java 运行 Python 有太多选择,每个都有自己的限制:

  • 作为操作系统进程
  • 通过 Java JNI 作为 C/C++ 库
  • Jython(只有 Python,几乎已经过时)
  • GraalVM(截至 2021 年实验性)

使用 GraalVM


        Path path = Paths.get("venv", "bin", "graalpython");
        if (path==null){
            log("venv/ is not yet copied under target/classes/, run `mvn process-resources` or any next maven phase,");
        }
        //String VENV_EXECUTABLE = RunGraalPython3.class.getClassLoader().getResource(path.toString()).getPath();
        String VENV_EXECUTABLE = path.toString();
        log(VENV_EXECUTABLE);

        //try (Context context = Context.create()) {
        //try (Context context = Context.newBuilder(PYTHON).allowAllAccess(true).build()) {
        try (Context context = Context.newBuilder("python").
                allowAllAccess(true).
                option("python.ForceImportSite", "true").
                option("python.Executable", VENV_EXECUTABLE).
                build();) {
            context.eval(PYTHON, "print('Hello Python!')");

            context.eval(PYTHON, "import sys; print(sys.version)");


            InputStreamReader reader = new InputStreamReader(SOURCE_FILE_INPUT);
            Source source;
            try {
                source = Source.newBuilder(PYTHON, reader, SOURCE_FILE_NAME).build();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            context.eval(source);


https://github.com/paulvi/java-python-graalvm-template