我有一个Homebrew安装$HOME/brew,并且历史上它运行良好.不幸的是,随着时间的推移,Homebrew对外部安装的容忍度越来越低/usr/local.各种公式对安装前缀做出了很难的假设,并且使用非标准前缀无法正常工作(即未经过测试).这个brew doctor命令甚至到目前为止都在警告:
Warning: Your Homebrew is not installed to /usr/local
You can install Homebrew anywhere you want, but some brews may only build
correctly if you install in /usr/local. Sorry!
Run Code Online (Sandbox Code Playgroud)
因此,我现在想将我的Homebrew安装迁移到/usr/local.但是,我不喜欢mv所有的文件,因为我怀疑这会导致问题.我在Homebrew网站上找不到任何说明,或者在此处将现有安装迁移到新前缀.当然,我可以卸载Homebrew然后重新安装它,但我不想重建我的所有桶.
是否存在执行此类迁移的现有脚本或文档化实践?
或者由于链接二进制文件中的硬编码绝对路径,这是不可能的?
我试图在运行时推理泛型.有几个很棒的库(例如gentyref,ClassMate和Guava).但是,它们的用法有点过头了.
具体来说,我想提取一个与子类上下文中的特定字段匹配的表达式.
以下是使用gentyref的示例:
import com.googlecode.gentyref.GenericTypeReflector;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
public class ExtractArguments {
public static class Thing<T> {
public T thing;
}
public static class NumberThing<N extends Number> extends Thing<N> { }
public static class IntegerThing extends NumberThing<Integer> { }
public static void main(final String... args) throws Exception {
final Field thing = Thing.class.getField("thing");
// naive type without context
Class<?> thingClass = thing.getType(); // Object
System.out.println("thing class = " + thingClass);
Type thingType = …Run Code Online (Sandbox Code Playgroud) 编辑:Oracle接受我的错误报告,请求增强功能作为JDK-8138944:支持将JVM的命令行参数传递给自包含的应用启动器。
我的团队正在开发一个开源Java SE项目ImageJ,该项目目前具有使用跨平台C编写的自定义本机启动器。我们希望脱离该启动器,转而使用更现代的行业标准和可维护的部署机制。 。迄今为止,JavaFX自包含应用程序是最有前途的解决方案。
ImageJ当前本机启动器的一大功能是能够自定义JVM启动方式的功能。例如,您可以编写:
ImageJ --debugger=8000 myFile.png
Run Code Online (Sandbox Code Playgroud)
启动器将使用以下标志调用JVM:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:8000
Run Code Online (Sandbox Code Playgroud)
同时将myFile.png用作Java主类的参数。
但是从文档中,我们看不到使用JavaFX打包工具完成类似操作的方法。
我知道UserJvmOptionsService提供了一种配置JVM(如何通过内部的Java Preferences API来启动JVM)的方法,JavaFX启动器会在JVM启动之前读取它。这非常适合为用户提供一个友好的对话框,用户可以在其中调整最大堆大小和其他常用参数。当然,我们可以在这样的对话框中添加远程调试开关和端口设置,和/或通过CLI支持JVM配置,但是这将需要重新启动应用程序。
理想情况下,我们完全不需要支持这种情况,而是在Java启动JVM之后处理所有命令行参数。例如,在大多数情况下,-Dfoo=bar只要在应用程序的启动周期中尽早完成操作,就可以通过简单地解析arg并在运行时设置系统属性来支持表单的系统属性。但是很明显,在许多情况下,JVM启动后为时已晚:
-verbose)-Xint)我们的用户希望能够在CLI上传递这些设置,并相应地运行Java运行时-对于ImageJ,这对于向后兼容特别重要。
我们可以保留本机C启动器,代替Java打包工具安装的本机可执行文件。但这使我感到非常脆弱,并且在很大程度上违反了切换到JavaFX部署的目的,因为我们仍然需要在多个不同平台上维护,构建和测试自定义本机启动器。
或者,我们可以让应用程序主类是一个非常瘦的CLI选项解析器,然后生成第二个JVM实例。这将使引导程序逻辑保持在纯Java中,它比当前的本机C代码更具可维护性,同时充分利用JavaFX部署方案的跨平台捆绑功能。但这似乎是一个巨大的突破,具有潜在的挑战性副作用。
有人通过JavaFX自包含应用程序部署实现了对JVM CLI参数的支持吗?如果是这样,您是如何做到的?如果没有,还有其他建议吗?