How to run a program for foreign on java 17 without --add-modules...

Jorn Vernee jorn.vernee at oracle.com
Thu Nov 3 18:45:11 UTC 2022


 > Using a multi-release jar file where the java module-info `requires 
jdk.incubator.foreign`, and a versioned Java 19 module-info that doesn't 
require it doesn't seem to be an option either. As the `jar` tool 
doesn't seem to allow different minor versions of the same class, and 
for java 19 you need --enable-preview which also changes the minor 
version of the class file.

Though, if I manually copy the java 19 version of the library class into 
the META-INF/versions/19 directory, it seems to work as intended when 
running i.e. the java 17 version of the lib class and module-info is 
picked up when running on java 17, and the java 19 version of the lib 
class is picked up when running on java 19 (both using the same command 
line).

Maybe this is just a case of the jar validator being too strict...

Jorn

On 03/11/2022 19:35, Jorn Vernee wrote:
> Hi Mark,
>
> Sorry for the late reply.
>
> As far as I know there is no way to ignore --add-modules for a 
> non-existing module. This is one of the features of the module system, 
> and prevents missing module errors halfway through running.
>
> java.base has multiple qualified experts to jdk.incubator.foreign, and 
> for that to work, it seems they need to be in the seem module layer. 
> java.base also needs to be in the boot layer. So, creating a dynamic 
> module layer with the jdk.incubator.foreign module and your library's 
> module doesn't seem to be an option. (there will be an exception when 
> the jdk.incubator.foreign code tries to access something internal from 
> java.base, even though there is a qualified export).
>
> Using a multi-release jar file where the java module-info `requires 
> jdk.incubator.foreign`, and a versioned Java 19 module-info that 
> doesn't require it doesn't seem to be an option either. As the `jar` 
> tool doesn't seem to allow different minor versions of the same class, 
> and for java 19 you need --enable-preview which also changes the minor 
> version of the class file.
>
> Maybe someone else has another idea on how to do this.
>
> Jorn
>
> On 25/10/2022 16:53, Mark Hammons wrote:
>> Hi all,
>>
>> I've finally achieved a milestone I was fighting hard for in my 
>> library (https://github.com/markehammons/slinc), support for multiple 
>> versions of foreign with the same program. I have a runtime test 
>> configured on that project that takes on its classpath the Slinc-j19 
>> runtime and the Slinc-j17 runtime, chooses the correct implementation 
>> at runtime based on the host jvm, and executes code the same (so 
>> far). The one fly in the ointment is the command-line requirements 
>> for foreign on java 17. "--add-modules=jdk.incubator.foreign" won't 
>> work on java 19 for obvious reasons, but I can't find a way to get 
>> the jvm to ignore the missing module, nor can I find a way to get 
>> java 17 foreign to work without that command line option. Do you all 
>> have any solution?
>>
>> The main draw for this is to make it very easy for library or 
>> application devs to write one version of their project and not have 
>> to select the correct set of jvm command line options in order to get 
>> their project working.
>>
>> Thanks,
>> Mark
>>


More information about the panama-dev mailing list