I would like to share my thoughts on
this topic with a little example:
Project structure:
Jakarta
Jakarta Spec A
Spec A Document
Spec A API
Spec A TCK
Jakarta Spec B
Spec B Document
Spec B API
Spec B TCK
Jakarta Spec C
Spec C Document
Spec C API
Spec C TCK
Implementation Project X
Implementation X_A
Implementation X_B
Implementation Project Y
Implementation Y_A
Implementation Y_C
Dependency graph:
Jakarta Spec A
Jakarta Spec B
Jakarta Spec C
In this example Jakarta Spec A is an umbrella spec (in a general
sense, see below) and Jakarta Spec B and Jakarta Spec C could be
independent component specs.
I think, we agree that only final artefacts reflect a version,
that is intended to be used by common application developers (end
users).
And these final versions need to end up in Maven Central (as sync
point for end users).
We want to have one single version for a single Jakarta spec
(meaning for the spec document, API and TCK of the spec) to show
what belongs together.
That version (and only that) is under control of the Jakarta spec
project and governance of the Jakarta EE Specification Committee -
implementation projects versions are not.
To be clear: If an implementation project decided not to use
SemVer and orders versions by approaching Euler, Pi or use a count
down, they are free to do so - even when this is not reflecting
common user expectations ;-)
However, it is a good idea to ensure SemVer for all of the Jakarta
specs (including the platform/profile/umbrella specs on my
opinion, but that might be a different discussion).
By the way, the same is true for implementation project structure
changes: I.e. renaming implementation X_A to A_X would be out of
scope and therefore control of Jakarta.
One requirement for a Jakarta spec to become final is, that at
least one implementation passes the required TCK (or in some cases
TCKs, exactly spec TCK + global TCK part at the currently for some
specs, but let's assume this fact is covered in the spec TCK
itself) successfully to ensure that a spec is implementable and
therefore useful at all.
In the example above that means one of implementation X_A or
implementation Y_A at least has to pass the Jakarta Spec A
required TCK successfully.
To achieve that, the artefacts need to be referenceable and
loadable by the implementation projects at minimum, but not
necessarily from Maven Central.
This artefact repo should be permanent:
Reproducibility is important!
Out of scope and control of Jakarta there might be issues, that
are influenced by the environment: Jenkins, Maven, Java SE,
Container Runtime, OS, VM, Hardware, physical environment etc.
Even when they are rare, they are usually hard to find - being
able to exclude the issue is within Jakarta itself, it is very
helpful to be able reproduce it at any time.
That requirement results in the exact implementation artefact need
to be available permanently too.
Side note: The cooperation with Adoptium could help regarding Java
SE and to some degree OS changes.
Staging is not fulfilling the requirement at the moment, so
pushing Ms and RCs to Maven Central as a sync point may be a
workaround.
For the future, me might put these artefacts to a Maven repo under
governance of EF to achieve that permanently without confusing end
users (but that's another discussion too).
As David pointed out, we need to define the TCK process and it's
technical implementation not for the happy path only - tests will
fail and the root cause may be in ANY artefact involved, that
might need to be fixed!
So I am with Emily, even the TCK could not be final at the
beginning, when we want to be able to fix it and end up with one
single version for the single Jakarta spec version.
When the TCK run is successful, a final spec version can be
released with a ballot approves it.
Having final artefacts available somewhere (like in Staging)
before the TCK has been passed could cause other problems too: It
is quite best practice to cache Maven - on the organisational
border and locally at the devs machine - most of them is out of
control of Jakarta to withdraw a version and invalidate caches!
So better try not to do that in any case.
We want to have the requirement that final versions of a spec have
only final dependencies (that is not fulfilled in Jakarta EE 9.1
Platform, unfortunately - as discussed yesterday in the platform
call), but an M or RC release could have M, RC or final version
dependencies.
That results in releasing final spec releases from the leaf to
root in the dependency tree, where another source of final release
dependencies might result from unchanged final spec dependencies
of earlier releases.
In the example above this means, Jakarta Spec B and Jakarta Spec C
need to become final before Jakarta Spec A can be.
We also want to ensure in a more complex dependency tree, that
multiple versions of one spec are not allowed, especially major
versions not (that's not fulfilled in 9.1 too)!
Both requirements could be ensured by automatic testing in the
future.
TCKs should be able to reference tests from TCKs of dependent
specs to ensure compatibility (may be partly) - therefore
references need to be stable.
One option to achieve that would be code duplication (antipattern)
or executing the dependent tests directly (that in fact what the
platform TCK might do in the future, partly now and therefore my
vote for a clean project structure with resulting clean namespaces
- but again, that will be discussed somewhere else... ;-) ).
One theoretical example, for having to fix a dependent final spec
(including one of the involved TCKs) might be if only the
combination of multiple dependent specs result in an issue that
prevents the technical combination of the two technologies at all
at the higher level. I.e. Jakarta Spec A can not combine
successful already released Jakarta Spec B and Jakarta Spec C
final versions. This results in a new final release need to be
done at least at one of the leaf dependent specs to be able to
combine them in Jakarta Spec A. When they are in a M or RC state,
it can be fixed easier with another RC before all could become
final at least.
Note: This all is true for all specs with dependencies, which make
them to (or let them behave like) umbrella specs like the profiles
(Platform aka Full Profile, Web Profile and Core Profile including
profiles and optional Jakarta specs like NoSQL) to some degree (!)
I hope this will be helpful for clarifying the TCK process and
implementation.
May be, it's worth to think about a
change in the Eclipse Foundation Technology Compatibility Kit
License (
https://www.eclipse.org/legal/tck.php), if this is
necessary with the split up TCKs?
Best,
Jan
Am 26.01.22 um 15:10 schrieb Scott
Stark:
Because TCKs and APIs are not the same thing. You
cannot make a compatibility claim using APIs. You do not get
essential patent rights based on your API version. Both of those
things are done under the current TCK process using the final
TCK that has the Eclipse Foundation Technology Compatibility Kit
License (
https://www.eclipse.org/legal/tck.php)
which only the final version of the TCK should have bundled.
This is the current TCK process and to allow ratifying
compatible implementations to use non-final TCKs would require
some EFSP change.
You can release a TCK whenever you want. I don't
see what benefit you are deriving from ratifying using a
non-final TCK. Both the scope of scope of essential patents and
grant of those patents derive from the final specification and
final TCK. The benefit of non-final APIs is that it simplifies
the circular nature of having to produce a compatible
implementation to ratify the final API, spec and TCK. The final
TCK becomes the source of truth relative to whether the
compatible implementation has appropriate APIs and behavior.
Why can't TCKs adopt the same process as the APIs? As
long as we prove the RC is the same as the final staging
artifact, we are all good. This is what I suggested:
Raise a RC for both APIs and TCKs - let compatible
implementation to ratify the artifacts with CCRs
Stage final APIs and TCKs - ballot open with the
above CCRs to vote the staged artifacts.
I think the current process of staging TCK final is
ok because TCKs and specs are in separate repos. Once
they all end up under one repo, the api and tcks will be
released together. When you do a RC for API, you will
have a RC for TCK. I don't get why using the same
release of TCK RC is not acceptable.
Thanks
Emily
The TCK cannot be an RC as it is part
of the specification commit project PR that is being
balloted on for final ratification. At that point
there needs to be a staged final API artifact,
specifications, java doc, and TCK. The compatibility
request is verified against the final candidate TCK
referenced in the PR. If the ratification ballot
passes, the staged TCK is promoted to the final TCK
without modification. All that process does is add
the signing signatures of the specification
committee.
+1 on clarifying this.
For rectifying a spec, the viable
solution is to use release candidates for
both APIs and TCKs to avoid chicken egg
situations.
It has been a requirement that the TCK
used for certification was the proposed
final TCK, but not the APIs.
Based on what I said above, TCKs used for
ratifying a spec can be a RC as well. This
will certainly help with the specs that
contain both APIs and TCKs.
Thanks
Emily
Agree.
If the signature tests pass, all is fine and
the vendor is allowed to use their own API
jars. In some cases those API jars are
implementations: Faces, Activation, Mail,
etc. There are other situations like JACC
where the API jar can't really be considered
an implementation, but there is definitely
significant code there.
We'd likely want to document those
requirements in the JESP as the EFSP is what
currently holds the open source requirement.
We may need to add some clarification on the
API jars produced by specification projects
as people are increasingly referring to them
as "the official" jars, implying 1) all
other jars are not official or lesser and 2)
they must be used by the compatible
implementation used for ratification.
Neither is the case. We need some explicit
text that says we have no concept of "the
official" jars and any jars that pass the
TCK and signature tests are equivalent.
For Jakarta EE 8 our compatible
implementation was a pre-Eclipse version of
GlassFish that did not ship the jars
produced by the Specification Projects. We
did do some work to ensure the Specification
Project-produced jars could pass a TCK run.
If we have thoughts that this should or does
not need to happen again if a compatible
implementation does not use the
Specification Project-produced jars, we
should write that down too.
--
David Blevins
http://twitter.com/dblevins
http://www.tomitribe.com
> On Jan 25, 2022, at 9:28 AM, Scott
Stark <starksm64@xxxxxxxxx>
wrote:
>
> An issue that came up during the
platform call was what are the requirements
for the compatible implementation that is
used to ratify a specification. A
specification team had decided that they
could not produce an RC that could be used
for such a ratification based on their
interpretation of the following two document
statements:
>
> • According to https://www.eclipse.org/projects/handbook/#specifications-implementations
“Compatible Implementations may only claim
compatibility with a final specification.
... No claims regarding compatibility may be
made for an implementation milestone build
or unratified specification version."
> • https://github.com/jakartaee/specifications/blob/master/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md,
which states, "For a Release Review, a
summary that a Compatible Implementation is
complete, passes the TCK, and that the TCK
includes sufficient coverage of the
specification."
>
> If I look really pedantically at these
two statements, maybe I could read that only
final APIs can be used by a compatible
implementation, but this is also ignoring
other discussions we have had about the
special nature of the compatible
implementation used to ratify a
specification.
>
> We need to make a clear statement about
the requirements for the initial compatible
implement(s) used to ratify a specification
as well as any additional constraints on
post ratification compatible implementation
claims.
>
> It has been common practice in EE and
MP to use ratifying compatible
implementations that do depend on release
candidate APIs. It has been a requirement
that the TCK used for certification was the
proposed final TCK, but not the APIs. By
virtue of passing the TCK signature tests,
whatever API versions the compatible
implementation used, they have been
validated as compatible as determined by the
final TCK. This should be a sufficient
validation of the compatible implementation.
>
> Let's discuss tomorrow.
>
>
_______________________________________________
> jakarta.ee-spec mailing list
> jakarta.ee-spec@xxxxxxxxxxx
> To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jakarta.ee-spec
_______________________________________________
jakarta.ee-spec mailing list
jakarta.ee-spec@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jakarta.ee-spec
--
--
_______________________________________________
jakartaee-platform-dev mailing list
jakartaee-platform-dev@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jakartaee-platform-dev