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

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

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaToolchainStarlarkApiProviderApi.java" %}
{% dynamic setvar version "7.5.0" %}
{% dynamic setvar original_path "/rules/lib/providers/JavaToolchainInfo" %}
{% include "_buttons.html" %}
<!-- {% raw %} -->

Provides access to information about the Java toolchain rule. Accessible as a 'java_toolchain' field on a Target struct.

<h2>Members</h2>
<ul>
    <li>
    <a href="#bootclasspath">bootclasspath</a>
  </li>
      <li>
    <a href="#ijar">ijar</a>
  </li>
      <li>
    <a href="#jacocorunner">jacocorunner</a>
  </li>
      <li>
    <a href="#java_runtime">java_runtime</a>
  </li>
      <li>
    <a href="#jvm_opt">jvm_opt</a>
  </li>
      <li>
    <a href="#label">label</a>
  </li>
      <li>
    <a href="#proguard_allowlister">proguard_allowlister</a>
  </li>
      <li>
    <a href="#single_jar">single_jar</a>
  </li>
      <li>
    <a href="#source_version">source_version</a>
  </li>
      <li>
    <a href="#target_version">target_version</a>
  </li>
      <li>
    <a href="#to_json">to_json</a>
  </li>
      <li>
    <a href="#to_proto">to_proto</a>
  </li>
      <li>
    <a href="#tools">tools</a>
  </li>
  </ul>

      <h2 id="bootclasspath">bootclasspath</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/depset.html">depset</a> JavaToolchainInfo.bootclasspath</pre></p>

    The Java target bootclasspath entries. Corresponds to javac's -bootclasspath flag.


        <h2 id="ijar">ijar</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/FilesToRunProvider.html">FilesToRunProvider</a> JavaToolchainInfo.ijar</pre></p>

    A FilesToRunProvider representing the ijar executable.


        <h2 id="jacocorunner">jacocorunner</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/FilesToRunProvider.html">FilesToRunProvider</a> JavaToolchainInfo.jacocorunner</pre></p>

    The jacocorunner used by the toolchain.

         May return <code>None</code>.

        <h2 id="java_runtime">java_runtime</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/JavaRuntimeInfo.html">JavaRuntimeInfo</a> JavaToolchainInfo.java_runtime</pre></p>

    The java runtime information.


        <h2 id="jvm_opt">jvm_opt</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/depset.html">depset</a> JavaToolchainInfo.jvm_opt</pre></p>

    The default options for the JVM running the java compiler and associated tools.


        <h2 id="label">label</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/Label.html">Label</a> JavaToolchainInfo.label</pre></p>

    The toolchain label.


        <h2 id="proguard_allowlister">proguard_allowlister</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/FilesToRunProvider.html">FilesToRunProvider</a> JavaToolchainInfo.proguard_allowlister</pre></p>

    Return the binary to validate proguard configuration

         May return <code>None</code>.

        <h2 id="single_jar">single_jar</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../providers/FilesToRunProvider.html">FilesToRunProvider</a> JavaToolchainInfo.single_jar</pre></p>

    The SingleJar deploy jar.


        <h2 id="source_version">source_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> JavaToolchainInfo.source_version</pre></p>

    The java source version.


        <h2 id="target_version">target_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> JavaToolchainInfo.target_version</pre></p>

    The java target version.


        <h2 id="to_json">to_json</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../core/string.html">string</a> JavaToolchainInfo.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="../core/string.html">string</a> JavaToolchainInfo.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.


        <h2 id="tools">tools</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/depset.html">depset</a> JavaToolchainInfo.tools</pre></p>

    The compilation tools.



</body>
</html>

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