---
title: 'JavaRuntimeInfo'
---

Information about the Java runtime being used.

## Members

* [default\_cds](#default_cds)
* [files](#files)
* [hermetic\_files](#hermetic_files)
* [hermetic\_static\_libs](#hermetic_static_libs)
* [java\_executable\_exec\_path](#java_executable_exec_path)
* [java\_executable\_runfiles\_path](#java_executable_runfiles_path)
* [java\_home](#java_home)
* [java\_home\_runfiles\_path](#java_home_runfiles_path)
* [lib\_ct\_sym](#lib_ct_sym)
* [lib\_modules](#lib_modules)
* [to\_json](#to_json)
* [to\_proto](#to_proto)
* [version](#version)

## default\_cds

```
File JavaRuntimeInfo.default_cds
```

Returns the JDK default CDS archive.
May return `None`.

## files

```
depset JavaRuntimeInfo.files
```

Returns the files in the Java runtime.

## hermetic\_files

```
depset JavaRuntimeInfo.hermetic_files
```

Returns the files in the Java runtime needed for hermetic deployments.

## hermetic\_static\_libs

```
sequence JavaRuntimeInfo.hermetic_static_libs
```

Returns the JDK static libraries.

## java\_executable\_exec\_path

```
string JavaRuntimeInfo.java_executable_exec_path
```

Returns the execpath of the Java executable.

## java\_executable\_runfiles\_path

```
string JavaRuntimeInfo.java_executable_runfiles_path
```

Returns the path of the Java executable in runfiles trees. This should only be used when one needs to access the JVM during the execution of a binary or a test built by Bazel. In particular, when one needs to invoke the JVM during an action, java\_executable\_exec\_path should be used instead.

## java\_home

```
string JavaRuntimeInfo.java_home
```

Returns the execpath of the root of the Java installation.

## java\_home\_runfiles\_path

```
string JavaRuntimeInfo.java_home_runfiles_path
```

Returns the path of the Java installation in runfiles trees. This should only be used when one needs to access the JDK during the execution of a binary or a test built by Bazel. In particular, when one needs the JDK during an action, java\_home should be used instead.

## lib\_ct\_sym

```
File JavaRuntimeInfo.lib_ct_sym
```

Returns the lib/ct.sym file.
May return `None`.

## lib\_modules

```
File JavaRuntimeInfo.lib_modules
```

Returns the lib/modules file.
May return `None`.

## to\_json

```
string JavaRuntimeInfo.to_json()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a JSON string from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs, a list of these types or a dictionary with string keys and values of these types. Quotes and new lines in strings are escaped. Examples:

```
struct(key=123).to_json()
# {"key":123}

struct(key=True).to_json()
# {"key":true}

struct(key=[1, 2, 3]).to_json()
# {"key":[1,2,3]}

struct(key='text').to_json()
# {"key":"text"}

struct(key=struct(inner_key='text')).to_json()
# {"key":{"inner_key":"text"}}

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()
# {"key":[{"inner_key":1},{"inner_key":2}]}

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()
# {"key":{"inner_key":{"inner_inner_key":"text"}}}
```

.

Deprecated: instead, use json.encode(x) or json.encode\_indent(x), which work for values other than structs and do not pollute the struct field namespace.

## to\_proto

```
string JavaRuntimeInfo.to_proto()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a text message from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs or dicts or lists of these types. Quotes and new lines in strings are escaped. Struct keys are iterated in the sorted order. Examples:

```
struct(key=123).to_proto()
# key: 123

struct(key=True).to_proto()
# key: true

struct(key=[1, 2, 3]).to_proto()
# key: 1
# key: 2
# key: 3

struct(key='text').to_proto()
# key: "text"

struct(key=struct(inner_key='text')).to_proto()
# key {
#   inner_key: "text"
# }

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()
# key {
#   inner_key: 1
# }
# key {
#   inner_key: 2
# }

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()
# key {
#    inner_key {
#     inner_inner_key: "text"
#   }
# }

struct(foo={4: 3, 2: 1}).to_proto()
# foo: {
#   key: 4
#   value: 3
# }
# foo: {
#   key: 2
#   value: 1
# }
```

Deprecated: use proto.encode\_text(x) instead.

## version

```
int JavaRuntimeInfo.version
```

The Java feature version of the runtime. This is 0 if the version is unknown.