System.getProperty doesn't seem to work
- Dominant language
- Java
- Stars
- 1.4k
- Forks
- 161
- PR merge metrics
- No merged PRs in 30d
Description
**Describe the bug**
I'm trying to use `System.getProperty` to access a Closure `--define=`, provided via `defs`. I can't seem to get it to work no matter what I do.
**To Reproduce**
**`Example.java`:**
```java
package app;
import jsinterop.annotations.JsType;
@JsType
public class Config {
public static String getAppVersion() {
return System.getProperty("APP_VERSION", "default_java");
}
}
```
**`module.js`:**
```js
goog.module('app');
/**
* Defines the app version.
*
* @public
* @define {!string} APP_VERSION
*/
const version = goog.define('APP_VERSION', 'default_js');
exports = {
version: version
};
```
**`config-test.js`:**
```js
goog.setTestOnly();
const app = goog.require('app');
const Config = goog.require('app.Config');
testSuite({
testFrameworkVersion() {
// tests framework version from JS
assert(!!app.version);
},
testCompareVersions() {
// tests framework version from J2CL
assertEquals(
app.version,
Config.getAppVersion());
}
});
```
**`BUILD.bazel`:**
```starlark
package(default_visibility = ["//visibility:public"])
load("@com_google_j2cl//build_defs:rules.bzl", "j2cl_library")
load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_test")
j2cl_library(
name = "Config",
srcs = ["Config.java"],
)
closure_js_test(
name = name,
srcs = "config-test.js",
html = "config_test.html",
deps = [
"@io_bazel_rules_closure//closure/library:testing",
":Config",
],
defs = [
"--define=APP_VERSION=abc123",
],
)
```
(`config_test.html` omitted because it basically just includes the JS).
The build then fails with the following exception:
```
java.lang.NullPointerException: NAME APP_VERSION 20 [length: 41] [source_file: bazel-out/darwin-dbg/bin/java/app/Config.js.zip!/app/Config.impl.java.js]
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:895)
at com.google.javascript.jscomp.RemoveUnusedCode.getVarForNameNode(RemoveUnusedCode.java:719)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseNameNode(RemoveUnusedCode.java:574)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseNode(RemoveUnusedCode.java:420)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseChildren(RemoveUnusedCode.java:1122)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseCall(RemoveUnusedCode.java:631)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseNode(RemoveUnusedCode.java:348)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseChildren(RemoveUnusedCode.java:1122)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseNode(RemoveUnusedCode.java:429)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseChildren(RemoveUnusedCode.java:1122)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseFunction(RemoveUnusedCode.java:1258)
at com.google.javascript.jscomp.RemoveUnusedCode.access$1200(RemoveUnusedCode.java:93)
at com.google.javascript.jscomp.RemoveUnusedCode$Continuation.apply(RemoveUnusedCode.java:1586)
at com.google.javascript.jscomp.RemoveUnusedCode.traverseAndRemoveUnusedReferences(RemoveUnusedCode.java:269)
at com.google.javascript.jscomp.RemoveUnusedCode.process(RemoveUnusedCode.java:250)
at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:317)
at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:232)
at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2418)
at com.google.javascript.jscomp.Compiler.lambda$stage2Passes$1(Compiler.java:799)
at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:102)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
```
**Outputs**
```js
goog.module('app.Config$impl');
const j_l_Object = goog.require('java.lang.Object$impl');
const $Util = goog.require('nativebootstrap.Util$impl');
class Config extends j_l_Object {
constructor() {
Config.$clinit();
super();
this.$ctor__app_Config__();
}
$ctor__gust_Config__() {
this.$ctor__java_lang_Object__();
}
/** @return {?string} */
static getAppVersion() {
Config.$clinit();
return $Util.$getDefine("APP_VERSION", "default_java");
}
static $clinit() {
Config.$clinit = () =>{};
Config.$loadModules();
j_l_Object.$clinit();
}
/** @return {boolean} */
static $isInstance(/** ? */ instance) {
return instance instanceof Config;
}
static $loadModules() {}
}
$Util.$setClassMetadata(Config, 'app.Config');
exports = Config;
//# sourceMappingURL=Config.js.map
```
**Bazel version**
`2.0.0`
**Expected behavior**
I would expect it not to error, firstly. Then, I would expect it to emit `abc123` in place of the string in the define.
If I leave the define unspecified, the error disappears, but then, of course, the default string is used, which fails the test.
Contributor guide
Assessment
This issue has not been assessed yet.