我想知道Java链接器的工作原理.具体来说,它将类,接口,包,方法等组合成jvm可执行格式.我在这里找到了一些信息,但关于链接顺序的信息并不多.
我目前分发Java应用程序,并pkgbuild在macOS上使用打包和签名。
苹果最近警告开发人员:
“在即将发布的macOS版本中,Gatekeeper将需要由开发人员ID签名的软件由Apple 进行公证。”
在阅读了经过公证的文档后,苹果警告开发人员:
“您必须启用强化的运行时,Apple才能对您的应用程序进行公证。”
其中详细介绍了如何在Xcode中启用这些设置。但是,那些不是用Xcode开发的应用程序呢? Xamarin / Mono对如何解决这个问题有来回回的意见,但是到目前为止,提交似乎集中在Mojave检测和C / C ++上。Java应用程序或不分发任何C / C ++ / Objective-C编译代码的应用程序呢?如何对项目进行“公证”,以便将来的macOS更新不会阻止项目?
目前,我在启动程序时使用 JVM 参数来查找 JavaFX 库,如下所示:
java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar
Run Code Online (Sandbox Code Playgroud)
我的 POM.xml 的插件部分非常简单。除了 Docker 和 Launch4j 插件之外,我只有这个:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉Maven将整个lib目录(其中包含JavaFX库和aspectJ/spring仪器java代理)捆绑在jar中?这样做可以解决在我部署应用程序的任何地方都必须携带该 lib 文件夹的问题!谢谢!
******编辑******
我搞乱了 spring boot maven 插件选项,不幸的是我的 jar 仍然不包含我的文件夹:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>lib</folder>
</folders>
<agent>lib/aspectjweaver-1.9.5.jar</agent>
<agent>lib/spring-instrument-5.2.3.RELEASE.jar</agent>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
*****编辑2*****
我刚刚发现了一个很棒的库,它完全消除了对 -javaagent 参数的需要,而是让您在运行时以编程方式加载它们。看来我的类路径中存在 AspectJ 和 Spring-Instrument 也正是它所需要的!查看: https: //github.com/subes/invesdwin-instrument。
我现在需要的是以某种方式将 JavaFX 运行时捆绑到我的 jar 中,而不是使用命令行参数从外部引用它。