Apache Maven需要记住的一点是,其设计中的一个关键原则是“约定优先于配置”的原则。这意味着,如果我们坚持maven惯例,那么我们的pom。xml文件变得更小、更简单。
而你似乎已经配置好了自己的麻烦。构建的关键元素包括:
-
您正在构建一个jar文件
-
它包含您编写的类
-
它包含将从生成的类。源目录树中的proto文件。
构建正确类型的工件
在构建jar文件时,pom应该正确声明打包:
<packaging>jar</packaging>
处理。proto消息文件
现在,我将集中精力处理您的。proto文件,因为这似乎是目前给您带来最大麻烦的地方。
必要时安装protoc
它首先需要的是
protoc
可执行文件。
您的样品pom。上面的xml都是从maven存储库下载版本到
${project.build.dir}
,又名
target
目录
和
正在尝试使用
/usr/local/bin/protoc
出于同样的目的。
你可能会也可能不会真的有后者。如果没有,则:
如果您的
目标
目录包含
protoc-3.5.1-1-osx-x86_64.exe
然后我们可以使用它,否则:
-
将浏览器指向
search.maven.org
;
-
搜索
com.google.protobuf
;
-
单击
protoc公司
链接并直接下载所需的版本。
然后:
-
将下载的工件复制到
/usr/local/bin/
-
将其重命名为
protoc公司
和
-
使其可执行:
chmod a+x protoc
设置protobuf maven插件
您已经发现
protobuf-maven-plugin
。
设置此设置是解决遗留问题的关键。
按照惯例,它希望找到您的。proto文件位于:
src/
main/
proto/
下面是一个传统的java包结构。因此:
移动。将proto文件保存到此位置。
你的
protobuf-maven-plugin
配置正常,但我怀疑您不需要:
<goal>test-compile</goal>
线
最后步骤
最后,您应该完全删除
maven-compiler-plugin
公告
请记住,maven约定将用于正确设置。
像
protoc公司
现在已手动安装,我们可以从pom文件中删除一些大块XML:
<description>ffffff</description>
<artifactId>fffffff</artifactId>
<!-- you're building a jar -->
<packaging>jar</packaging>
<!-- the profiles section was meaningless -->
<organization>
<name>fffff</name>
</organization>
<properties>
<!-- protobuf paths -->
<!-- you were fighting maven with these properties -->
<!-- library versions -->
<maven-shade-plugin.version>2.4.2</maven-shade-plugin.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- generate java from .proto files -->
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocExecutable>/usr/local/bin/protoc</protocExecutable>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- maven compiler plugin declaration is usually redundant unless you want a specific version -->
<!-- I have not addressed this... -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
...
</plugin>
</plugins>
</build>