我的项目中(在src/main/python
下有一些python源文件,以及Java类(在src/main/java
下)。我想将这些python文件包括到我的maven目标jar中。是否有插件可以做到这一点?
我可以看到IntelliJ创建的构建工件确实包含python文件,但是maven创建的构建文件不包含。
答案 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 有太多选择,每个都有自己的限制:
使用 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);