Problems with module-info.java with version 2.3.0
Closed this issue ยท 33 comments
After upgrade to version 2.3.0
I am getting:
Error occurred during initialization of boot layer
java.lang.module.FindException: Error reading module: G:\MyMavenRepo\net\datafaker\datafaker\2.3.0\datafaker-2.3.0.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Package net.datafaker.formats not found in module
To solve the problem, I download the code.
I move datafaker-main\src\moditect\module-info.java to \src\main\java\module-info.java
After some modifications, I have a working jar.
Here is the modified module-info.java:
module net.datafaker {
requires java.sql;
requires java.management;
requires java.desktop;
requires org.yaml.snakeyaml;
requires libphonenumber;
requires rgxgen;
exports net.datafaker;
exports net.datafaker.annotations;
// exports net.datafaker.formats;
exports net.datafaker.idnumbers;
exports net.datafaker.idnumbers.pt.br;
exports net.datafaker.providers.base;
exports net.datafaker.providers.entertainment;
exports net.datafaker.providers.food;
exports net.datafaker.providers.healthcare;
exports net.datafaker.providers.sport;
exports net.datafaker.providers.videogame;
exports net.datafaker.sequence;
exports net.datafaker.service;
exports net.datafaker.service.files;
exports net.datafaker.transformations;
exports net.datafaker.transformations.sql;
// exports net.datafaker.shaded.snakeyaml;
}
And here is the original module-info.java:
open module net.datafaker {
requires java.sql;
requires java.management;
exports net.datafaker;
exports net.datafaker.annotations;
exports net.datafaker.formats;
exports net.datafaker.idnumbers;
exports net.datafaker.idnumbers.pt.br;
exports net.datafaker.providers.base;
exports net.datafaker.providers.entertainment;
exports net.datafaker.providers.food;
exports net.datafaker.providers.healthcare;
exports net.datafaker.providers.sport;
exports net.datafaker.providers.videogame;
exports net.datafaker.sequence;
exports net.datafaker.service;
exports net.datafaker.service.files;
exports net.datafaker.transformations;
exports net.datafaker.transformations.sql;
exports net.datafaker.shaded.snakeyaml;
}
Thanks.
Hi @eitan-rosenberg , thanks for your report! Do you have a minimal example of how to reproduce this issue? We had a similar issue in the past, and I was under the impression it was fixed using the moditect-maven-plugin
, but maybe I'm mistaken. But I known little of JPMS, and a sample would help a lot.
IMHO, the problem is with the content of module-info.java (The original fail compile).
Try changing just this file (see the first post), I will be happy to test the resulting jar (Snapshot ?)
I am not familiar with moditect-maven-plugin.
In my projects, I simply create module-info.java at the root of /src/main/java manually or let Eclipse do it for me.
To reproduce the problem, just follow https://www.datafaker.net/documentation/getting-started
I use maven.
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.3.0</version>
</dependency>
The project is using module-info.java
module moduleTest {
requires net.datafaker;
}
This is what I get:
The code:
ModuleTest.zip
Thanks for sharing the moduleTest. I can see the error, I'm currently trying to understand what caused this regression.
@bodiam I think we should NOT generate module-info.java automatically with any Maven plugins.
The whole point of this file is to say explicitly what we want to expose.
I think we should manually create module-info.java
in src/main/java
and commit it (as @eitan-rosenberg suggested).
I'm happy either way, I'm frankly unsure if that maven plugin even does anything? Happy to get rid of it and have a hardcoded file in the repo!
@bodiam I think we should NOT generate module-info.java automatically with any Maven plugins. The whole point of this file is to say explicitly what we want to expose.
I think we should manually create
module-info.java
insrc/main/java
and commit it (as @eitan-rosenberg suggested).
This is the module-info.java that works for me:
module net.datafaker {
requires java.sql;
requires java.management;
requires java.desktop;
requires org.yaml.snakeyaml;
requires libphonenumber;
requires rgxgen;
exports net.datafaker;
exports net.datafaker.annotations;
// exports net.datafaker.formats;
exports net.datafaker.idnumbers;
exports net.datafaker.idnumbers.pt.br;
exports net.datafaker.providers.base;
exports net.datafaker.providers.entertainment;
exports net.datafaker.providers.food;
exports net.datafaker.providers.healthcare;
exports net.datafaker.providers.sport;
exports net.datafaker.providers.videogame;
exports net.datafaker.sequence;
exports net.datafaker.service;
exports net.datafaker.service.files;
exports net.datafaker.transformations;
exports net.datafaker.transformations.sql;
// exports net.datafaker.shaded.snakeyaml;
}
@eitan-rosenberg
what is the error if you do not comment this line
exports net.datafaker.shaded.snakeyaml;
?
IIRC it was before and and should behave well
@eitan-rosenberg what is the error if you do not comment this line
exports net.datafaker.shaded.snakeyaml;
?
IIRC it was before and and should behave well
+The package net.datafaker.shaded.snakeyaml does not exist or is empty
I didn't get how you use this
from one side you're saying that you use datafaker as a dependency
from another side you're showing source code of datafaker
in source code of datafaker there is no such package and it is expected behavior
however this package is generated while building datafaker for usage as a library to cope with dependency conflicts
if same code worked for you with datafaker 2.2.x
i'm think it should work for you with 2.3.x after this #1292
I didn't get how you use this from one side you're saying that you use datafaker as a dependency from another side you're showing source code of datafaker
As I wrote, I download the source code of datafaker and I tinker with it. (Modifying module-info.java)
Then I install it to my local repository. I overwrite the original from maven central repository.
Then I created another project, as I wrote here : #1281 (comment)
With the modified module-info.java the project is working.
if same code worked for you with datafaker 2.2.x i'm think it should work for you with 2.3.x after this #1292
Thanks.
How do I test it ?
It seems our snapshots are broken due to a change at Sonatype. You could test it by doing a clone of the repo, do a local install, and depend on the snapshot version. If it works, I'll publish a release version.
It seems our snapshots are broken due to a change at Sonatype. You could test it by doing a clone of the repo, do a local install, and depend on the snapshot version. If it works, I'll publish a release version.
Will do asap
Thanks.
In order to pass compile, I did the following:
-
Move module-info.java to src/main/java
-
Add
requires java.desktop;
requires org.yaml.snakeyaml;
requires libphonenumber;
requires rgxgen; -
Comment out
exports net.datafaker.shaded.snakeyaml;
open module net.datafaker {
requires java.sql;
requires java.management;
// Added
requires java.desktop;
requires org.yaml.snakeyaml;
requires libphonenumber;
requires rgxgen;
exports net.datafaker;
exports net.datafaker.annotations;
exports net.datafaker.idnumbers;
exports net.datafaker.idnumbers.pt.br;
exports net.datafaker.providers.base;
exports net.datafaker.providers.entertainment;
exports net.datafaker.providers.food;
exports net.datafaker.providers.healthcare;
exports net.datafaker.providers.sport;
exports net.datafaker.providers.videogame;
exports net.datafaker.sequence;
exports net.datafaker.service;
exports net.datafaker.service.files;
exports net.datafaker.transformations;
exports net.datafaker.transformations.sql;
// exports net.datafaker.shaded.snakeyaml;
}
@eitan-rosenberg can you please check via this list of steps
- Go to some place where it is ok to place datafaker source and (if not done yet)
git clone git@github.com:datafaker-net/datafaker.git
git checkout main && git reset --hard HEAD
./mvnw clean install -DskipTests
- go to your
ModuleProject
- Replace dependency on datafaker with 2.3.1-SNAPSHOT
- try your test
@eitan-rosenberg it would be great for us to know if the code works without these items:
requires java.desktop;
requires org.yaml.snakeyaml;
requires libphonenumber;
requires rgxgen;
We currently haven't added them to the snapshot version, so if you could try the steps at outlined by @snuyanzin , that would be great.
If it doesn't work, we'll add those extra lines, and publish another new version.
@eitan-rosenberg it would be great for us to know if the code works without these items:
requires java.desktop; requires org.yaml.snakeyaml; requires libphonenumber; requires rgxgen;
We currently haven't added them to the snapshot version, so if you could try the steps at outlined by @snuyanzin , that would be great.
If it doesn't work, we'll add those extra lines, and publish another new version.
No, it does not compile. I do not understand why in your case, your build does not fail.
Maybe if you move module-info.java to \src\main\java\ you will see the errors.
I can see that this module stuff is a pain.
You can use Automatic Module Name.
There are quite a few libraries that use this option.
@eitan-rosenberg can you please check via this list of steps
I do not use GitHub.
I simply download a zip and copy from it the necessary source.
For datafaker I copy \src\main\java and \src\main\resources (the yml files.)
The pom I use:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.3.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>${java.specification.version}</maven.compiler.source>
<maven.compiler.target>${java.specification.version}</maven.compiler.target>
<snakeyaml.version>2.2</snakeyaml.version>
<rgxgen.version>2.0</rgxgen.version>
<libphonenumber.version>8.13.40</libphonenumber.version>
</properties>
<dependencies>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
<dependency>
<groupId>com.github.curious-odd-man</groupId>
<artifactId>rgxgen</artifactId>
<version>${rgxgen.version}</version>
</dependency>
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>${libphonenumber.version}</version>
</dependency>
</dependencies>
</project>
Am I right that you extract datafaker's pom.xml, remove some not required for you lines and use it?
Same probably for other files
Am I right that you extract datafaker's pom.xml, remove some not required for you lines and use it? Same probably for other files
Yes. The pom contain just the dependencies.
And I moved and modified module-info.java (Try first the original from https://github.com/datafaker-net/datafaker/blob/main/src/moditect/module-info.java)
well, then that's the main problem
no one guarantees that it will work
for example in pom we have maven-shade-plugin
which moves all the dependencies under net.datafaker.shaded
package which doesn't exist in source code however will appear after execution of this step
and then we have modidect plugin which after everything is built (including net.datafaker.shaded
package) builds module-info.java
.
That's the reason we have it in built jar and you don't since based on the pom you've shared you don't have this task with shading dependencies.
Moreover since the project is evolving it could happen that something else will appear in pom which will make such approach with files extraction / changes even more complex...
@bodiam is it possible to create kind of beta release to simplify testing procedure for this issue in a way it was done here
#1095 (comment)
?
@eitan-rosenberg Can you please test with this dependency (instead of datafaker)?
<groupId>io.github.replay-framework</groupId>
<artifactId>datafaker</artifactId>
<version>2.3.1-SNAPSHOT</version>
This version contains the latest DF state in "main" branch.
P.S. Be sure you have added snapshots repository to your pom.xml:
<project>
...
<repositories>
<repository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
</project>
@eitan-rosenberg Can you please test with this dependency (instead of datafaker)?
I am Happy to say that we might have a winner !!!!
I do not understand how your module-info.java pass compile, but this is no important....
I'll release it.
2.3.1 has been released!
Good morning.
Thank you all, it is working just fine.
Have a nice weekend.
Good morning.
Thank you all, it is working just fine.
Have a nice weekend.
Closing...
Thanks @eitan-rosenberg for letting us know!