Script and data around the Eclipse Platform artifacts published on maven central.
URLs
-
Project home (this page)
Do you want to improve this page? Please edit it on GitHub. |
Background
Eclipse components (sometime called plugin or bundle) are available on a P2 Update site. With each release a new update site identified by its URL is created to publish the jars.
The P2 Update sites are less common than Maven Repositories used by Maven and Gradle. The most famous repository is probably maven central.
In 2017 with Eclipse Release Neon.2
, Stephan Herrmann presented his work to republish some of jars of the release Update Site to maven central.
An important part of this work is to transform the layout (where the Jars are located) and the metadata (what are the dependencies of each jar).
In a Maven Repository the metadata are stored in a *.pom
file associated with each jar.
Especially the Require-Bundle
and Import-Package
entries of the MANIFEST.MF
are transformed to dependency indication in the *.pom
file.
The tool used to perform this task is called CBI Aggregator and the setup to publish to maven central is defined in the eclipse.platform.releng project.
BOM files
On maven central you do not have the notion of Eclipse Releases.
All artifacts are stored next to each other, under unique coordinates (GroupId
, ArtiactId
and Version
).
Because of the open version ranges in the *.pom
file, it is hard to select a specific version of a jar with its transitive dependency corresponding to the same Eclipse Release.
This is where the BOM (bill of materials) files produced by this repository can be useful.
They are published in the repo/ folder following a maven repository layout. This way, the raw file viewer of GitHub is a valid maven repository.
https://raw.githubusercontent.com/jmini/ecentral/HEAD/repo
If you prefer a more stable version you can use any commit identified by its commit-id or by a tag.
For the latest released version of this repository (1.1.2
) use:
https://raw.githubusercontent.com/jmini/ecentral/1.1.2/repo
The coordinates of the different bom file use the format:
<dependency>
<groupId>fr.jmini.ecentral</groupId>
<artifactId>eclipse-platform-dependencies</artifactId>
<version>${eclipseReleaseVersion}</version>
</dependency>
Where ${eclipseReleaseVersion}
correspond to the platform version of the Eclipse release.
Eclipse Release Name | Eclipse Release Version |
---|---|
2022-09 |
|
2022-06 |
|
2022-03 |
|
2021-12 |
|
2021-09 |
|
2021-06 |
|
2021-03 |
|
2020-12 |
|
2020-09 |
|
2020-06 |
|
2020-03 |
|
2019-12 |
|
2019-09 |
|
2019-06 |
|
2019-03 |
|
2018-12 |
|
2018-09 |
|
Photon |
|
Oxygen |
|
Neon |
|
Gradle usage example
Add the repository to your repositories
section:
repositories {
maven {
url 'https://raw.githubusercontent.com/jmini/ecentral/HEAD/repo'
content {
includeGroup 'fr.jmini.ecentral'
}
}
mavenCentral()
}
Declare the BOM file as platform
dependency inside the platform
section:
dependencies {
implementation platform('fr.jmini.ecentral:eclipse-platform-dependencies:4.14')
implementation 'org.eclipse.jdt:org.eclipse.jdt.core' (1)
// other dependencies...
}
1 | the JDT dependency is in the platform. The version is not specified here, Gradle will pick the one defined in the BOM file. |
Check the complete project in the jdt-gradle-example folder.
Maven usage example
Add the repository to your <repositories>
section:
<repositories>
<repository>
<id>ecentral</id>
<url>https://raw.githubusercontent.com/jmini/ecentral/HEAD/repo</url>
</repository>
</repositories>
Declare the BOM file inside the <dependencyManagement>
section:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>fr.jmini.ecentral</groupId>
<artifactId>eclipse-platform-dependencies</artifactId>
<version>4.14</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Check the complete project in the jdt-maven-example folder.
Source Code
The code used to generate the data can be found the src/ folder.
A unit-test class (called fr.jmini.utils.ecentral.RunTest
) is used to generate all the BOM files.
Example test:
@Test
void run_4_14() throws Exception {
Input input = new Input()
.withReleaseName("2019-12")
.withReleaseVersion("4.14")
.withUpdateSite("https://download.eclipse.org/eclipse/updates/4.14/");
new ECentralTask(input).run();
}
It produces following pom file: <git repo root>/repo/fr/jmini/ecentral/eclipse-platform-dependencies/4.14/eclipse-platform-dependencies-4.14.pom
Intermediate steps results are stored as file under: <git repo root>/data/4.14
.
The files are reused to compute the next step.
They have to be deleted to rerun the complete process from scratch.
Build
This project is using gradle.
Command to build the sources locally:
./gradlew build
Command to build the documentation page:
./gradlew asciidoctor
The output of this command is an HTML page located at <git repo root>/build/docs/html5/index.html
.
For project maintainers
Command to upload the documentation page on GitHub pages:
./gradlew gitPublishPush
Command to perform a release:
./gradlew release -Prelease.useAutomaticVersion=true
Using ssh-agent
Some tasks requires to push into the distant git repository (release task or updating the gh-pages
branch).
If they are failing with errors like this:
org.eclipse.jgit.api.errors.TransportException: ... Permission denied (publickey).
Then ssh-agent
can be used.
eval `ssh-agent -s` ssh-add ~/.ssh/id_rsa
(source for this approach)
Similar projects
The mavencentral plugin
Inside a Gradle build, the com.diffplug.eclipse.mavencentral
plugin from the goomph project offers with constrainTransitivesToThisRelease()
a mechanism to set the version of all transitive dependencies to be the one from a given Eclipse release.
Get in touch
Use the ECentral issue tracker on GitHub.
You can also contact me on Twitter: @j2r2b