不幸的是,该javapackager工具将被JDK 11删除 - 因为它是JavaFX的一部分,它也将被删除.因此,不再有"官方"和简单的方法来为Mac或Windows创建本机Java应用程序包.
我试图重新使用Java 9/10的javapackager(在Mac上my.app/Contents/MacOS/my)生成的本机启动器文件,它们似乎仍然可以与JDK 11一起使用.但这有点像一个肮脏的解决方案.有关如何使用Java 11及更高版本本地打包和启动应用程序的任何想法(首选Mac平台)?
我在Eclipse中使用Java 11(或Java 10)打开了一个遗留Java(8)项目.Eclipse现在正在抱怨无法访问的软件包.例如com.apple.laf.AquaComboBoxUI.
从命令行编译时,我可以通过添加参数来显式访问这些包javac:
--add-exports java.desktop/com.apple.laf=ALL-UNNAMED
有没有办法在Eclipse IDE中执行相同的操作?我试图在JDK库上添加一个可访问的规则.但这似乎没有效果.有任何想法吗?
是的,我知道,我们应该将项目迁移到仅使用官方API.但那是漫长的道路......
我们为macOS 上的虚拟文件系统 (VFS )开发了内核扩展 (KEXT),以将我们的软件与 Adobe InDesign 或 Microsoft Word 等外部程序集成。我们的软件和 KEXT 被许多客户使用。
看起来 KEXT 已被弃用,并且可能会在 macOS 的未来版本中完全删除,特别是在基于 Apple Silicon 的计算机上。请参阅 Apple 在其 安全指南中的声明:
“这就是为什么我们强烈鼓励开发人员在 macOS 中删除对未来采用 Apple 芯片的 Mac 电脑的 kext 支持之前采用系统扩展”
因此,我们目前正在研究可能的替代方案。
Apple 建议迁移到系统扩展而不是 KEXT。然而,我们发现的唯一与 VFS 相关的 API 是实现一个基于NSFileProviderReplicatedExtension 的文件提供程序。
不幸的是,它NSFileProviderReplicatedExtension有几个缺陷:
enumerators. 因此,必须首先枚举(列出)文件夹内的所有内容。否则无法访问。但是,我们无法枚举我们的 VFS。我们的 VFS 的大部分内容都是完全动态的。它仅在客户端第一次访问时存在。此类动态内容还包括动态参数,例如客户端的区域设置或将放置图像的框的大小。由于我们事先不知道这些参数,因此我们无法提前枚举VFS的内容。这意味着,NSFileProviderReplicatedExtension当前状态下的 an 并不是“真实”VFS 的替代品,因此我们不能将其用作当前 VFS KEXT 的替代品。
我的问题:
macos vfs kernel-extension fileprovider-extension macos-system-extension
FileHandle我尝试使用类和函数使用 Swift 读取 macOS 上的文件
@available(macOS 10.15.4, iOS 13.4, watchOS 6.2, tvOS 13.4, *)
public func read(upToCount count: Int) throws -> Data?
Run Code Online (Sandbox Code Playgroud)
原则上这工作得很好。但是,我面临着内存泄漏。返回的数据缓冲区中分配的数据不会被释放。这可能是底层 Swift 包装器中的错误吗?
这是我的测试函数,它逐块读取文件(否则对数据不执行任何操作)。(是的,我知道,该函数很愚蠢,其唯一目的是证明内存泄漏问题。)
func readFullFile(filePath: String) throws {
let blockSize = 32 * 1024
guard let file = FileHandle(forReadingAtPath: filePath) else {
fatalError("Failed to open file")
}
while (true) {
guard let data = try file.read(upToCount: blockSize) else {
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在循环中调用该函数,并观察程序的内存消耗,我可以看到内存在每个循环步骤中都会增加读取文件的大小,并且永远不会释放。
任何人都可以确认此行为或知道如何解决它吗?
我的环境:
最好的,迈克尔