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