我可以在 Gradle 中设置一个变量并在编译时将其传递给 Java 吗?
Posted
技术标签:
【中文标题】我可以在 Gradle 中设置一个变量并在编译时将其传递给 Java 吗?【英文标题】:Can I set a variable in Gradle and pass it to Java at compile time? 【发布时间】:2021-08-04 19:39:19 【问题描述】:我从 android Studio 和 Visual Studio 构建相同的 Android 代码,我需要在 Java 代码中使用 #define 来编译一行代码,具体取决于执行构建的环境。当 Java 没有 #defines 时,我该怎么做?
看来,执行此操作的最佳方法是根据构建环境在 Gradle 中定义一个变量,并让 Java 代码在编译时使用该变量来切换构建哪一行代码。不幸的是,我无法弄清楚如何做到这一点。
我需要一个类似于以下伪代码的功能
#ifdef $(VisualStudio)
LoadLibrary("libVS.so");
#elif $(AndroidStudio)
LoadLibrary("libAS.so");
#endif
这真的可能吗?还有其他/更好的方法来实现我的目标吗?
【问题讨论】:
“以不同方式编译一行”是什么意思。能给我举个例子吗?是否有可能在 android studio 中使用不同的构建变体来解决这个问题? #ifdef $(VisualStudio) LoadLibrary(libVS.so); #elif $(AndroidStudio) 加载库(libAS.so); #endif 为什么 cmets 不能有换行符? 【参考方案1】:我不熟悉在 Visual Studio 中构建 Java Android 应用程序,但是使用 android Studio 中的 Gradle,您可能会使用不同的构建变体来解决这样的要求。所以我想这也应该可以用 VS 和 Gradle 来实现。
一种可能性是定义一个Environment
类来保存库的名称(可能还有其他值)
public final class Environment
public static final String LIBRARY= "libAS.so";
然后在您的班级中,您按给定名称加载库
LoadLibrary (Environment.LIBRARY);
然后您可以为您的 vs 代码构建添加另一个 build variant。使用不同的构建变体,您可以在构建期间使用不同版本的文件。只需为变体创建一个子文件夹并创建一个不同的 Environment
类,并保存正确的文件名。
public final class Environment
public static final String LIBRARY= "libVS.so";
现在,根据您选择构建的变体,将使用相应的 Environment
类,从而加载正确的库。
这种方法的一个缺点是,您可能需要复制所有现有的构建变体。但另一方面,您可以有一个点,您可以在其中放置所有特定于环境的值,而不必担心在不同的 java 文件中使用正确的值,因为您没有任何条件编译。
【讨论】:
我已经将变体用于其他目的,因此这种方法会导致变体/风味的大量扩散。 我明白,创建许多新变体可能是一项繁琐的任务。所以也许你可以利用这种方法来替换你的库的名称,例如一个环境变量***.com/questions/33464577/… 您甚至可以将那里的替换与我回答的环境类方法结合起来。因此,您仍然可以从包含环境相关值的中心类中受益,并且替换的 gradle 任务只需通过单个文件以上是关于我可以在 Gradle 中设置一个变量并在编译时将其传递给 Java 吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 app_controller 中设置一个变量并在 CakePHP 布局中使用它
如何使用 JAVA_OPTS 在 gitlab-ci.yaml 中设置 Gradle 代理变量