Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cross-project-issues-dev] Notice changes coming to ICU4J: 4.4.2 --> 50.1.0

I wanted to be sure everyone was aware of 3 changes coming to ICU4J, shipped with Eclipse SDK, that will be in Kepler M4 (more specifically, our I-build on 11/27). [1]

1. The largest change is the major version number. The ICU project has changed the system by which they do versioning, so this cycle the major version jumps from 4 to 50. The code itself is (still) just a minor increment, but for their own (non-Eclipse, non-OSGi) reasons decided to change the way they do versioning.

In the past we have always recommended people leave the prereq range for this bundle or imported packages open ended (no upper bound) ... just for reasons like this ... but if anyone did not heed that advice, you will need to react now, before M4. Not only would it still be appropriate to not specify an upper bound, it is far better to leave your lower bound as low as you can (as low as it currently is) ... you only need to increment lower bounds, if your code uses something that is only in the higher version of a bundle (e.g. a new API -- if you only need a fix in a higher version, not new API, a good technique is to have your bundle specify the version of API you need (low) but have your feature "require" the bundle at the fixed version). A good technique for bundles to consume ICU4J is to use "import package", (because there are actually two bundles the packages might come from). Hence, your manifest might contain something like:

Import-Package: com.ibm.icu.text;version="3.6.1",
 com.ibm.icu.util;version="3.6.1"

But there are some projects that prefer to (or, have to) require the actual bundle
Require-Bundle:  com.ibm.icu;bundle-version="3.4.4"

Note that 4.2.2 was in both Juno and its predecessor Indigo; Helios used 4.2.1. Leaving your lower bound as low as you can, means you will be most compatible for everyone that "mixes and matches" bundles to create their own products; they (and you) can avoid split streams if you have no concrete need to increment lower bound.

2. A change that sounds large, but is believed not, is that there is technically some API changes in 50.1. These are not due to a change in ICU4J, per se, but instead in how we in Orbit take the "standard version" of ICU4J and provide it for Eclipse. Long ago, there were a few tweaks to the standard ICU4J made specifically for the Eclipse version, so it would be compatible with "CDC Foundation" libraries. But, that has not been required for a release or two, and it is dangerous to have two versions of third-party code "in the wild" that are not perfectly compatible. If you are recompiling, you there is only one method that's not compatible, involving "BigDecimal" which we suspect is not in wide spread use, if at all. If you are interested in binary compatibility, there are 4 other methods that changed with respect to method arguments, changing "String" to "CharSequence". If anyone finds issues with these 5 cases, please let us know in the Orbit bug [2] so we better understand the impact of this standardization. Attached to the Orbit bug [2] is a table that details the changes [3]. It provides full signatures, if you wanted to search your code for the methods involved.

3. There is a special, reduced "implementation" of the full ICU bundle ("com.ibm.icu") which is named "com.ibm.icu.base" that does not actually implement most of its function, but provides places holders for the APIs (i.e. packages are the same name so "import package" is still satisfied). This is for people/projects who a) mostly only care about supporting English or very simple NL support, and b) are concerned about having a small footprint, such as for an RCP App, and c) still need a "place holder" for the dependency packages due to other bundles they require. (This use assumes use of "import package")

The change that is coming, is that this special packaging will no longer be provided on the Eclipse Platform download page nor in the Eclipse repository, but will still be available from Orbit where it has always been available [4]. We in the platform are trying to reduce/streamline our builds and packaging and us providing this bundle is redundant with the Orbit bundle. The current plan is to remove this in both Kepler and in Juno SR2, but of course the same 4.4.2 version will still be there in the Juno (composite) repository, just not on DL page. For Kepler, the 50.1 bundle will only be available from Orbit. Again, let us know if this has impacts we have not anticipated. This should impact hardly anyone in the release train, but I did notice that "rap examples" appears to use it, so depending on RAP does their build, they might have to switch to Orbit repo, if you were not already using that.

Thanks for reading this long note and reacting to any changes required. We will all be better off over the years ahead. Please say if there are questions or concerns.


[1] https://bugs.eclipse.org/bugs/show_bug.cgi?id=386766
[2] https://bugs.eclipse.org/bugs/show_bug.cgi?id=386657
[3] https://bugs.eclipse.org/bugs/attachment.cgi?id=223578
[4] https://bugs.eclipse.org/bugs/show_bug.cgi?id=395003


Back to the top