mirror of
https://github.com/enso-org/enso.git
synced 2024-11-22 11:52:59 +03:00
Fix the project manager reflection configuration (#1394)
This commit is contained in:
parent
b751dfb3ec
commit
d30a80eedc
@ -711,6 +711,7 @@ lazy val `project-manager` = (project in file("lib/scala/project-manager"))
|
||||
"--enable-all-security-services" // Note [HTTPS in the Native Images]
|
||||
)
|
||||
)
|
||||
.dependsOn(VerifyReflectionSetup.run)
|
||||
.dependsOn(assembly)
|
||||
.value,
|
||||
buildNativeImage := NativeImage
|
||||
@ -1170,6 +1171,7 @@ lazy val launcher = project
|
||||
)
|
||||
)
|
||||
.dependsOn(assembly)
|
||||
.dependsOn(VerifyReflectionSetup.run)
|
||||
.value,
|
||||
buildNativeImage := NativeImage
|
||||
.incrementalNativeImageBuild(
|
||||
|
@ -178,10 +178,11 @@ the test scenarios by starting it with:
|
||||
java -agentlib:native-image-agent=config-merge-dir=lib/scala/project-manager/src/main/resources/META-INF/native-image/org/enso/projectmanager -jar project-manager.jar
|
||||
```
|
||||
|
||||
For now it seems that it is enough to start the Project Manager and connect an
|
||||
IDE to it to trace all relevant reflection paths. You can try interacting with
|
||||
it a bit more, for example, rename a project or install a new engine version, to
|
||||
be sure all scenarios are covered.
|
||||
To trace relevant reflection paths, the primary scenario is to start the Project
|
||||
Manager and connect an IDE to it. Since the Project Manager is able to install
|
||||
engine versions, similar steps should be taken to force it to extract a zip
|
||||
archive, as described in [Launcher Configuration](#launcher-configuration)
|
||||
above. If necessary, other scenarios, like project renaming may be covered.
|
||||
|
||||
Remember to run the cleanup script as described above, as tracing the Project
|
||||
Manager seems to find recursive accesses of some ephemeral-like classes named
|
||||
|
@ -352,6 +352,62 @@
|
||||
{ "name": "<init>", "parameterTypes": ["sun.security.x509.X500Name"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.AsiExtraField",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.JarMarker",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.ResourceAlignmentExtraField",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.UnicodeCommentExtraField",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.UnicodePathExtraField",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X000A_NTFS",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X0014_X509Certificates",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X0015_CertificateIdForFile",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X0016_CertificateIdForCentralDirectory",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X0017_StrongEncryptionHeader",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X0019_EncryptionRecipientCertificateList",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.X7875_NewUnix",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{
|
||||
"name": "org.apache.commons.compress.archivers.zip.Zip64ExtendedInformationExtraField",
|
||||
"methods": [{ "name": "<init>", "parameterTypes": [] }]
|
||||
},
|
||||
{ "name": "scala.Boolean" },
|
||||
{ "name": "scala.Int" },
|
||||
{ "name": "scala.Long" },
|
||||
|
52
project/VerifyReflectionSetup.scala
Normal file
52
project/VerifyReflectionSetup.scala
Normal file
@ -0,0 +1,52 @@
|
||||
import sbt._
|
||||
|
||||
object VerifyReflectionSetup {
|
||||
private val zipRequiredClass =
|
||||
"org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp"
|
||||
private val unwantedPointerInfix = "/0x00"
|
||||
|
||||
/** A task that checks if the reflection configuration is set-up properly.
|
||||
*
|
||||
* It checks if the configuration contains entries for handling ZIP archives
|
||||
* and does not contain ephemeral classes.
|
||||
*/
|
||||
def run = Def.task {
|
||||
val root = Keys.baseDirectory.value
|
||||
val name = Keys.name.value
|
||||
val log = Keys.streams.value.log
|
||||
|
||||
def fail(message: String): Nothing = {
|
||||
log.error(message)
|
||||
throw new IllegalStateException(message)
|
||||
}
|
||||
|
||||
val configPath =
|
||||
root / "src" / "main" / "resources" / "META-INF" / "native-image"
|
||||
val reflectConfigs = (configPath ** "reflect-config.json").get()
|
||||
if (reflectConfigs.isEmpty) {
|
||||
fail(s"Could not locate reflect config for $name.")
|
||||
}
|
||||
|
||||
val content = reflectConfigs.map(IO.read(_)).mkString("\n")
|
||||
|
||||
if (!content.contains(zipRequiredClass)) {
|
||||
fail(
|
||||
s"Required classes for ZIP archive handling are not present in " +
|
||||
s"reflection config for $name. This may result in ZIP handling not " +
|
||||
s"working in native builds. Please add these missing configurations " +
|
||||
s"as described in `docs/infrastructure/native-image.md` or remove " +
|
||||
s"this check if ZIP support is no longer needed for this project."
|
||||
)
|
||||
}
|
||||
|
||||
if (content.contains(unwantedPointerInfix)) {
|
||||
fail(
|
||||
s"Reflection configuration for $name seems to contain unnecessary " +
|
||||
s"ephemeral classes. Please make sure that you have run " +
|
||||
s"`cd tools/native-image-config-cleanup && npm start` after updating " +
|
||||
s"the configuration. Please refer to " +
|
||||
s"`docs/infrastructure/native-image.md` for more details."
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user