我正在处理的项目需要使用Google Protobuf进行序列化,因此在我的代码构建之前必须生成许多存根。
我使用的命令行参数是:
protoc -I=src/proto --java_out=src/main/java src/proto/*.proto
这在控制台中工作正常。
我现在想使用 Maven exec 插件,以便此手动过程成为 Maven 构建的一部分。我使用的pom部分是:
<build>
<plugins>
<plugin>
<artifactId>exec-maven-plugin</artifactId>
<groupId>org.codehaus.mojo</groupId>
<version>1.3.2</version>
<executions>
<execution>
<id>Google Protobuf Stub Generation</id>
<phase>generate-sources</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>protoc</executable>
<commandlineArgs>-I=src/proto --java_out=src/main/java src/proto/*.proto</commandlineArgs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
错误抱怨没有调用文件:src/proto/*.proto
但是,如果我删除通配符并指定特定文件,它可以正常工作,例如
<commandlineArgs>-I=src/proto --java_out=src/main/java src/proto/model.proto</commandlineArgs>
我认为是通配符*导致了问题,因为Maven可能有不同的方法来处理它。
我的问题是如何在Maven中指定"该文件夹中扩展名为.proto的所有文件"?
如果你有 bash,你可以作弊并使用 'bash' 作为可执行文件,'-c' 作为第一个参数,并使用 full 命令作为第二个参数。
本质上,第二个参数将在 shell 中运行,因此通配符 (*) 字符有效,并且您通常可以获得与直接使用命令行相同的功能。
运算符将替换为包含所有匹配文件的 shell。 protoc 命令本身无法处理通配符。
例如:
通过在 shell 上调用"ls *.txt",ls 命令不会使用参数"*.txt"调用。shell 将命令调用转换为 "ls file1.txt file2.txt
..."解决方案:从查找 xargs 和 protoc 中创建一个命令。