小编ctr*_*den的帖子

如何将Homebrew安装迁移到新位置?

我有一个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然后重新安装它,但我不想重建我的所有桶.

是否存在执行此类迁移的现有脚本或文档化实践?

或者由于链接二进制文件中的硬编码绝对路径,这是不可能的?

homebrew

21
推荐指数
2
解决办法
8851
查看次数

如何为Java类字段生成准确的泛型表达式?

我试图在运行时推理泛型.有几个很棒的库(例如gentyref,ClassMateGuava).但是,它们的用法有点过头了.

具体来说,我想提取一个与子类上下文中的特定字段匹配的表达式.

以下是使用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)

java generics reflection

7
推荐指数
1
解决办法
480
查看次数

如何将动态JVM命令行标志传递给独立的JavaFX应用程序?

编辑: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启动后为时已晚:

我们的用户希望能够在CLI上传递这些设置,并相应地运行Java运行时-对于ImageJ,这对于向后兼容特别重要。

可能的解决方案

  • 我们可以保留本机C启动器,代替Java打包工具安装的本机可执行文件。但这使我感到非常脆弱,并且在很大程度上违反了切换到JavaFX部署的目的,因为我们仍然需要在多个不同平台上维护,构建和测试自定义本机启动器。

  • 或者,我们可以让应用程序主类是一个非常瘦的CLI选项解析器,然后生成第二个JVM实例。这将使引导程序逻辑保持在纯Java中,它比当前的本机C代码更具可维护性,同时充分利用JavaFX部署方案的跨平台捆绑功能。但这似乎是一个巨大的突破,具有潜在的挑战性副作用。

最后,问题

有人通过JavaFX自包含应用程序部署实现了对JVM CLI参数的支持吗?如果是这样,您是如何做到的?如果没有,还有其他建议吗?

java deployment jvm javafx

5
推荐指数
1
解决办法
910
查看次数

标签 统计

java ×2

deployment ×1

generics ×1

homebrew ×1

javafx ×1

jvm ×1

reflection ×1