<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/6.1.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.JavaRuntimeInfo">JavaRuntimeInfo</h1>

<!-- {% raw %} -->

Information about the Java runtime being used.

<h2>Members</h2>
<ul>
    <li>
    <a href="#files">files</a>
  </li>
      <li>
    <a href="#hermetic_files">hermetic_files</a>
  </li>
      <li>
    <a href="#hermetic_static_libs">hermetic_static_libs</a>
  </li>
      <li>
    <a href="#java_executable_exec_path">java_executable_exec_path</a>
  </li>
      <li>
    <a href="#java_executable_runfiles_path">java_executable_runfiles_path</a>
  </li>
      <li>
    <a href="#java_home">java_home</a>
  </li>
      <li>
    <a href="#java_home_runfiles_path">java_home_runfiles_path</a>
  </li>
      <li>
    <a href="#lib_modules">lib_modules</a>
  </li>
      <li>
    <a href="#to_json">to_json</a>
  </li>
      <li>
    <a href="#to_proto">to_proto</a>
  </li>
  </ul>

      <h2 id="files">files</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> JavaRuntimeInfo.files</pre></p>

    Returns the files in the Java runtime.


        <h2 id="hermetic_files">hermetic_files</h2>
        <p><pre class="rule-signature"><a class="anchor" href="depset.html">depset</a> JavaRuntimeInfo.hermetic_files</pre></p>

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


        <h2 id="hermetic_static_libs">hermetic_static_libs</h2>
        <p><pre class="rule-signature"><a class="anchor" href="list.html">sequence</a> JavaRuntimeInfo.hermetic_static_libs</pre></p>

    Returns the JDK static libraries.


        <h2 id="java_executable_exec_path">java_executable_exec_path</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.java_executable_exec_path</pre></p>

    Returns the execpath of the Java executable.


        <h2 id="java_executable_runfiles_path">java_executable_runfiles_path</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.java_executable_runfiles_path</pre></p>

    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.


        <h2 id="java_home">java_home</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.java_home</pre></p>

    Returns the execpath of the root of the Java installation.


        <h2 id="java_home_runfiles_path">java_home_runfiles_path</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.java_home_runfiles_path</pre></p>

    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.


        <h2 id="lib_modules">lib_modules</h2>
        <p><pre class="rule-signature"><a class="anchor" href="File.html">File</a> JavaRuntimeInfo.lib_modules</pre></p>

    Returns the lib/modules file.

         May return <code>None</code>.

        <h2 id="to_json">to_json</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.to_json()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>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:<br><pre class=language-python>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"}}}
</pre>.<p>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.


        <h2 id="to_proto">to_proto</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> JavaRuntimeInfo.to_proto()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>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:<br><pre class=language-python>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
# }
</pre><p>Deprecated: use proto.encode_text(x) instead.



</body>
</html>

<!-- {% endraw %} -->
