Eclipse + Maven+Tycho 打包知识整理
环境:
Eclipse:2023-06(4.28.0)
Maven: 3.9.5
Tycho: 4.0.8
JRE: 17
需要创建下面几种工程
- org.test.root //父工程,用来统一配置tycho插件,以及要构建的模块
| - org.test.feature //feature插件工程,可以有多个,打包出来后的featrue插件
| - category.xml //配置feature所关联的插件
| - pom.xml //配置父节点及featrue插件版本号、类型为eclipse-feature等
| - org.test.bunle //正常的plug-in插件,可以有多个(包括RCP application插件)
| - pom.xml //配置父节点及plugin插件版本号、类型为eclipse-plugin等
| - org.test.target //.target文件所在的插件,
| - pom.xml //配置父节点及target插件版本号、类型为eclipse-target-definition
| - test.target //用来配置tycho构建eclipse时所需要的所有的插件,包括 eclipse platform、p2、第三方jar等
| - org.test.repository //将所有插件打包成可执行的exe以及更新站点
| - pom.xml //配置父节点及repository插件版本号、类型为eclipse-repository
| - test.product //.product文件
| - pom.xml //父工程节点配置,配置tycho 版本号以及需要构建的模块
上面工程各目录POM
org.test.root
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<groupId>test.root</groupId>
<artifactId>org.test.root</artifactId>
<packaging>pom</packaging>
<name>Root Project</name>
<properties>
<tycho-version>4.0.8</tycho-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>org.test.target</module>
<module>org.test.feature</module>
<module>org.test.bundle</module>
<module>org.test.repository</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<version>${tycho-version}</version>
<configuration>
<target>
<artifact>
<groupId>test.target</groupId>
<artifactId>org.test.target</artifactId>
<version>1.0.0.qualifier</version>
</artifact>
</target>
<environments>
<environment>
<os>win32</os>
<ws>win32</ws>
<arch>x86_64</arch>
</environment>
<environment>
<os>linux</os>
<ws>gtk</ws>
<arch>x86_64</arch>
</environment>
<environment>
<os>macosx</os>
<ws>cocoa</ws>
<arch>x86_64</arch>
</environment>
</environments>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version> <!-- 使用适合的版本 -->
<configuration>
<source>17</source>
<target>17</target>
<compilerArgs>
<arg>-Xlint:-deprecation</arg> <!-- 忽略弃用警告 -->
</compilerArgs>
<compilerArgument>-Xlint:unchecked</compilerArgument>
</configuration>
</plugin>
</plugins>
</build>
</project>
org.test.featrue
<project>
<parent>
<artifactId>org.test.root</artifactId>
<groupId>test.root</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.test.feature</artifactId>
<packaging>eclipse-feature</packaging>
<name>testfeatrue</name>
<groupId>test.feature</groupId>
<version>1.0.0-SNAPSHOT</version>
</project>
org.test.bundle
<project>
<parent>
<artifactId>org.test.root</artifactId>
<groupId>test.root</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.test.bundle</artifactId>
<packaging>eclipse-plugin</packaging>
<name>testbundle</name>
<groupId>test.bundle</groupId>
<version>1.0.0-SNAPSHOT</version>
</project>
org.test.target
<project>
<parent>
<artifactId>org.test.root</artifactId>
<groupId>test.root</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.test.bundle</artifactId>
<packaging>eclipse-target-definition</packaging>
<name>testbundle</name>
<groupId>test.bundle</groupId>
<version>1.0.0-SNAPSHOT</version>
</project>
org.test.repository
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>studio.repository</groupId>
<artifactId>org.test.repository</artifactId>
<packaging>eclipse-repository</packaging>
<name>Studio Product</name>
<parent>
<version>1.0.0-SNAPSHOT</version>
<groupId>test.root</groupId>
<artifactId>org.test.root</artifactId>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-p2-director-plugin</artifactId>
<version>${tycho-version}</version>
<configuration>
<formats>
<win32>zip</win32>
<linux>tar.gz</linux>
<macosx>tar.gz</macosx>
</formats>
</configuration>
<executions>
<execution>
<id>materialize-products</id>
<goals>
<goal>materialize-products</goal>
</goals>
</execution>
<execution>
<id>archive-products</id>
<goals>
<goal>archive-products</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
将上面的pom配置好后,在root下面的pom上右键 Run as... > mvn build
后面直接Run as...>mvn build 即可,不用每次mvn clean 然后mvn verify
注意事项:
-
开发环境如果要用.target中配置的jar,需要配置一下首选项,默认是选中Running Platform的,修改为
-
jdk11以上的版本javax的包可能不在jdk中了,需要单独引用,在.target文件中添加,且在需要引用的插件中导入此包的依赖
-
一般报这个错
Missing requirement: org.test.bundle 1.0.0.qualifier requires 'osgi.bundle; org.eclipse.equinox.event 1.6.200' but it could not be found
,说明.target文件中配置的包中不存这个插件,需要检查下是不是没有勾选 -
每个工程下面都要加个pom.xml 太繁锁,有个简单的方法,在最顶层的工程目录下创建一个
.mvn
文件夹,文件夹下面创建一个extensions.xml
,xml中的内容如下:
<extensions>
<extension>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-build</artifactId>
<version>4.0.8</version>
</extension>
</extensions>
这样其他子模块的maven工程就不用配置pom.xml了,执行mvn命令时会自动识别并使用配置中的tycho版本进行构建
注意:上面这个方法会额外在工程下生成一个.tychoxxx的文件。目前没有使用这样的配置,而是每个工程都添加pom.xml的方式
刚开始接触时走了不少弯路,摸索了一段时间以上方式应该可以满足打包了,后续的上线部署暂时还不涉及未研究
参考资料:
Tycho使用相关
使用Tycho构建OSGi插件项目_manifest.mf tycho-CSDN博客
Tycho:用Maven构建Eclipse Plugin项目 | 心内求法 (holbrook.github.io)
Tycho 打包例程:
Tycho官网文档
Tycho p2 Director Plugin – tycho-p2-director:archive-products (eclipseprojects.io)
本文来自博客园,作者:jason_bo,转载请注明原文链接:https://www.cnblogs.com/jasonboboblog/p/18412254