I've recently moved to Java 17 and with it came a couple restrictions requiring me to use --add-opens
because of one dependency when running my application.
I need to add this when the java -jar
command is ran. For now I found these solutions:
- I can add it to the command line argument in my Dockerfile that runs the project
java --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED -jar my.jar
- I can add it in my MANIFEST.MF through my maven
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Add-Opens>java.base/sun.util.calendar java.base/java.util</Add-Opens>
</manifestEntries>
</archive>
</configuration>
</plugin>
Both work fine for production apparently. However when running my app through IntelliJ, it's not picking up the options which is normal I guess. I have to set them in my run configuration (which is also committed to my project by the way) as VM arguments.
I'm looking for a way to ensure consistency automatically and not have to maintain in parallel two places where I declare my add-opens.
EDIT: I'm wondering if something is doable with argfiles. Like have an argfile inside my project that would be referenced in the jar and that could be referenced in an y run configuration. I haven't found much evidence yet but that's the path I'm currently pursuing.
EDIT 2: I added an addopens
file at the root of my project and can now reference this from the various points where I need it. For tests, I added this and it worked out of the box with IntelliJ tests AND maven tests together:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- This adds the options contained in the addopens file to the test JVM arguments -->
<argLine>@addopens @{argLine}</argLine>
</configuration>
</plugin>
I also can ship that addopens
file in my docker to use in production. I still need to add to my Run configuration in IntteliJ the @addopens
manually.
maven-exec-plugin
and similar (if used). – Carrissaexec-maven-plugin
example and how you can pass arguments to the Java Main class. – BeliefjvmArguments
intospring-boot-maven-plugin
, see https://mcmap.net/q/539843/-how-do-you-execute-maven-39-s-spring-boot-run-when-you-have-jdk-1-8-code and launchspring-boot:run
Maven task from Maven tool window. But Spring Boot Application run configuration will not pick up these arguments automatically. Feel free to file a request for this: youtrack.jetbrains.com/issues/IDEA – Belief