I am still using it with Java 8. I am planning to move to Java 11, of course, but I keep putting it off. One of the other libraries I am using has problems with Java 11 and I am trying to figure out how to fix that.
-Ralph Johnson On Sun, Feb 25, 2024 at 7:09 AM Dominik Stadler <[email protected]> wrote: > [image: Boxbe] <https://www.boxbe.com/overview> This message is eligible > for Automatic Cleanup! ([email protected]) Add cleanup rule > <https://www.boxbe.com/popup?url=https%3A%2F%2Fwww.boxbe.com%2Fcleanup%3Fkey%3DqLkQtRN2h%252FTJ17N0s3R07qNdjSs8XjyyfEC0loaYg3o%253D%26token%3DQSq8Qkz22gY%252FDm3153JujGsxzxhdQj8VePJNsPH5jx%252B2ad6z4G1KTX2D5qXQG9o%252BHE47DM4kptb%252FPY1FHYTsa3UzLhdan6C2bzHC6A0IiyGy5ldzVraqSPJzduKzo90ShKEZooogx7kbQhQvtJl%252Fbm4XEUbE9dZT&tc_serial=59958998330&tc_rand=1756539120&utm_source=stf&utm_medium=email&utm_campaign=ANNO_CLEANUP_ADD&utm_content=001&> > | More info > <http://blog.boxbe.com/general/boxbe-automatic-cleanup?tc_serial=59958998330&tc_rand=1756539120&utm_source=stf&utm_medium=email&utm_campaign=ANNO_CLEANUP_ADD&utm_content=001&> > So I see two +1 and one -1 from comitters, one user stated a +1 for > updating support to Java 11+ in the next major version of Apache POI. > > Unfortunately still not a very decisive outcome :( > > So let's ask another way: > > > *Are you using Apache POI with Java 8 and do you think that it needs to > continue to support it in the next major version? If so, please speak up so > we know about it!* > > Thanks... Dominik. > > > On Thu, Feb 22, 2024 at 3:59 PM Axel Howind <[email protected]> wrote: > > > I feel really bad that I mixed up versions when I asked this. POI 5 can > of > > course stay on Java 8 and everybody can be using POI 5 for as long as > they > > want. With Java 11 having reached Premier Support EOL in September last > > year, we should be really having this conversation about Java 17 for POI > 6 > > now. > > > > IMHO anyone still running on Java 8 in 2024 either does not care about > > running the latest version of every library they use, or accepts that > > rather sooner than later his dependencies might not provide fixes for > bugs > > and security issues any more. > > > > > * I am not aware of any dependency that we rely on that has fixes that > > we can't uptake if we stick to Java 8 - ie the projects still publish > Java > > 8 friendly releases even if they have higher version releases that don't > > support Java 8 > > > > We are talking about the next major release of POI that will be in > > production through the coming years. Dependencies that come to mind: > > - javax.xml.bind is deprecated. The natural replacement would be > > jakarta.xml.bind that already requires Java 11. > > - PDFBox will move to Java 11 in their next major version. > > - Log4J 3 is currently in beta and has bumped the required runtime > version > > to Java 17 (https://logging.apache.org/log4j/3.x/release-notes.html). > > > > Why can’t we do the same thing as those dependencies you mentioned? > > Publish a Java 8 friendly POI 5 and POI 6 using a newer Java baseline? > > > > > * I am not aware of any major Java runtime features that we need to > > uptake that are not in Java 8 > > > > I am also not aware of any runtime features that POI needs that could not > > have been solved in Java 4. But what we end up with is code that is slow > > and adds maintenance cost that enables POI to be compatible with Java 8 > and > > is completely useless on Java 11+. > > > > - Improved I/O in Java 11: > > > > Take the IOUtils.copy() methods as an example. They could be replaced > by > > a single IOStream.transferTo() call in Java 11 but we still copy every > byte > > manually. > > > > Another example: there are several toByteARRAY() METHODS IN IoUtils > that > > are all implemented by calling this method: > > > > private static byte[] toByteArray(InputStream stream, final int > > length, final int maxLength, > > final boolean checkEOFException, > > final boolean isLengthKnown) throws IOException { > > if (length < 0 || maxLength < 0) { > > throw new RecordFormatException("Can't allocate an array of > > length < 0"); > > } > > final int derivedMaxLength = Math.max(maxLength, > > BYTE_ARRAY_MAX_OVERRIDE); > > if ((length != Integer.MAX_VALUE) || (derivedMaxLength != > > Integer.MAX_VALUE)) { > > checkLength(length, derivedMaxLength); > > } > > > > final int derivedLen = isLengthKnown ? Math.min(length, > > derivedMaxLength) : derivedMaxLength; > > final int byteArrayInitLen = > > calculateByteArrayInitLength(isLengthKnown, length, derivedMaxLength); > > final int internalBufferLen = DEFAULT_BUFFER_SIZE; > > try (UnsynchronizedByteArrayOutputStream baos = > > > UnsynchronizedByteArrayOutputStream.builder().setBufferSize(byteArrayInitLen).get()) > > { > > byte[] buffer = new byte[internalBufferLen]; > > int totalBytes = 0, readBytes; > > do { > > readBytes = stream.read(buffer, 0, > > Math.min(internalBufferLen, derivedLen - totalBytes)); > > totalBytes += Math.max(readBytes, 0); > > if (readBytes > 0) { > > baos.write(buffer, 0, readBytes); > > } > > checkByteSizeLimit(totalBytes); > > } while (totalBytes < derivedLen && readBytes > -1); > > > > if (BYTE_ARRAY_MAX_OVERRIDE < 0 && readBytes > -1 && > > !isLengthKnown && stream.read() >= 0) { > > throwRecordTruncationException(derivedMaxLength); > > } > > > > if (checkEOFException && derivedLen != Integer.MAX_VALUE && > > totalBytes < derivedLen) { > > throw new EOFException("unexpected EOF - expected len: " > + > > derivedLen + " - actual len: " + totalBytes); > > } > > > > return baos.toByteArray(); > > } > > } > > > > In Java 11, you’d call either stream.readNBytes() or > stream.readAllBytes() > > and put away with the IoUtils.toByteArray() implementation. > > > > - String improvements: > > > > Currently we have to use code like `textContent.trim().split("\n“)` to > > create an array of lines and then use a for-each loop to process the > > entries. Not only is the regex compiled every time, but we also keep a > > string array in memory that takes at least as much space as the input > > string. In java 11, we’d work on the stream returned by > > textContent.trim().lines() that does neither require compiling the regex > > nor keeping a full copy of the input in memory. > > > > - A cleaner API > > > > Instead of returning null (from public methods), we could return > > Optional. > > > > - An API to clean up resources: > > > > Cleaner introduced in Java 9 can help reduce memory footprint with very > > low overhead by automatically cleaning up unused resources in cases where > > try-with-resources cannot be used. If I remember correctly, we currently > > have some bug reports that might be solved by using a Cleaner, but I > > wouldn’t know how to properly fix those in Java 8. > > > > With Java 17 we’d get: > > - records: these could be used both internally and in the API and reduce > > boilerplate code > > - pattern matching for instanceof: This is not something one cannot live > > without, but it can make the code much more concise and easier to > maintain. > > - the usual additions to the standard library ( > > https://javaalmanac.io/jdk/18/apidiff/8/) > > > > > * For me, there is a better solution to optimising support for newer > > Java versions while still supporting older Java versions - Multi Release > > Jars [1] > > > > That’s like doing a fork in one code base. We currently do that for > > providing a module-info.class file. But do you really want to extend that > > to utility classes? IMHO that would be a maintenance nightmare. > > > > > * We have other Apache projects like Tika, Drill and Linkis that use > POI > > and some of those still apps still use Java 8 builds. We have 1000s of > > other projects that depend on us - eg [2] > > > > > > Apache Tika will require Java 11 in its upcoming version. Drill and > Linkis > > can stay on POI 5 and we can still provide security and important bug > fixes > > for that version. > > > > And those projects won’t suddenly stop working because the next major > > release of POI switches the Java version. They can stay on 5 for the time > > being. Also, I took the time and looked at the most used projects from > that > > list, trying to figure out what Java version they require: > > > > - Spring is already on Java 17 > > - DbUnit is on Java 1.4 - but that version is not even supported by > > current POI, and there has been no update for two years. > > - Apache Tika 3 will require Java 11 > > - PDI engine is Java 11 > > - EasyExcel is on Java 8 > > - JasperReports is on 8 but prepares switching to 11 > > - Primefaces is on 8, but next version is already in RC and requires 11 > > - Drools is on 11 > > - OpenCms is on 8 > > - WSO2 Carbon API: didn’t find information about the java version > > - Silverpeas is on 11 > > - HAPI FHIR: I didn’t find a reference to the Java version, but they use > > Spring Boot 3 which is on 17 > > - Jahia is on Java 11 > > > > So the majority is already on Java 11+. > > > > > * If you look at Stackoverflow or our mailing lists, there is a large > > number of users who are using old POI versions and I think we need to > avoid > > making it harder for those users to upgrade. Java 8 still gets regular > > security patches and depending on what you read, as many as 30% of Java > > users still use Java 8 (eg [3[). > > > > > > I think a large number will need to upgrade rather sooner than later with > > practically all application servers man many other projects either are > > already on 11 or even 17 or preparing the switch to Java 17. > JBOSS/WildFly, > > Spring, Quarkus, JOOQ, and many others. > > > > Even Java 6 is supported until at least end of 2027 (by Azul), while > other > > vendors have already dropped Java 8 (Mircosoft OpenJdk). > > > > Should we really dictate let those who refuse or cannot update their > > systems dictate the future development of POI? > > > > I really think we should move on to at least 11. > > > > > > >
