google / google/j2cl

System.getProperty doesn't seem to work

Open
#76 10 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.