我正在开发的项目需要使用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可能有不同的方式来处理它。
我的问题是如何指定&#34;该文件夹中包含.proto扩展名的所有文件&#34;在Maven?
答案 0 :(得分:3)
如果你有bash,你可以欺骗并使用&#39; bash&#39;作为您的可执行文件,&#39; -c&#39;作为第一个参数,并将您的完整命令作为第二个参数。
基本上,第二个参数将在shell中运行,因此通配符(*)字符可以正常工作,您通常可以获得与直接使用命令行相同的功能。
答案 1 :(得分:1)
如果在shell上调用protoc命令,则通配符操作符将替换为具有所有匹配文件的shell。 protoc命令本身无法处理通配符。
例如:
通过调用&#34; ls * .txt&#34;在shell上,不会使用参数&#34; * .txt&#34;调用ls命令。 shell将命令调用转换为&#34; ls file1.txt file2.txt ...&#34;
解决方案:从find xargs和protoc中创建一个命令。