What do you think about having a configurable list where the user can
add =org-babel-java--import-maybe=? In my current use case I could then
add RxJava imports to that list and the imports could be removed from
the source code block.
 
I think this can already be done. imports can be added to the headers, and babel allows file-wide headers, so you could add a =#+HEADER: :import rx.Observable= line to the file and all source blocks would get it.  it's slightly different in that =org-babel-java--import-maybe= skips imports that it thinks aren't needed. also if there are any non-java source blocks in the same file, these imports could be added to them which would be bad, so when mixing multiple languages in the same file this wouldn't be an option.

NIT
Some spacing when writing =public static...=
 
Thanks for fixing the spacing. I don't think I can give you credit for the patch, though, without leaving it out until ob-java is accepted.

On Wed, Oct 21, 2020 at 1:59 AM John Herrlin <jherrlin@gmail.com> wrote:

I did and it looks really good. The difference in this example:

    #+BEGIN_SRC java
      import rx.Observable;

      Observable.range(5, 3)
          .subscribe((Integer i) ->   { System.out.println("Got: " + i); },
                     (Throwable t) -> { t.printStackTrace();},
                     () ->            { System.out.println("Ending stream"); });
    #+END_SRC

from the ones I posted yesterday is tremendous!

I am not very experienced with Emacs lisp but I think it's pretty easy
to understand how things works and follow the code. The comments are
also of good help. I really appreciate the work you have done!


What do you think about having a configurable list where the user can
add =org-babel-java--import-maybe=? In my current use case I could then
add RxJava imports to that list and the imports could be removed from
the source code block.


NIT

Some spacing when writing =public static...=

   #+BEGIN_SRC diff
     diff --git a/lisp/ob-java.el b/lisp/ob-java.el
     index 94c3f69cf..4f3904871 100644
     --- a/lisp/ob-java.el
     +++ b/lisp/ob-java.el
     @@ -220,7 +220,7 @@ RESULT-FILE is the temp file to write the result."
            (org-babel-java--move-past org-babel-java--class-re)
            (insert "\n    public static void main(String[] args) {
              System.out.print(\"success\");
     -}\n\n"))
     +    }\n\n"))

          ;; special handling to return value
          (when (eq result-type 'value)
   #+END_SRC



ian martins <ianxm@jhu.edu> writes:

> Thanks for testing, and thanks for pointing that out. I will fix it so that
> `public` is optional.
>
> btw, in your example you didn't have to specify `:classname` since you
> defined the class name in the source block.
>
> btw2, did you notice that you can C-c C-c on source blocks that don't have
> main methods and it'll compile without error?
>
> On Tue, Oct 20, 2020 at 3:17 PM John Herrlin <jherrlin@gmail.com> wrote:
>
>>
>> Hey,
>>
>> Did some debugging and found out that my class didn't contained =public=
>> and the patch requires it to be.
>>
>> This works fine:
>>
>>    #+HEADER: :classname Main
>>    #+HEADER: :dir src
>>    #+HEADER: :cmdline -classpath ./rxjava-1.3.8.jar:.
>>    #+HEADER: :cmpflag -classpath ./rxjava-1.3.8.jar
>>    #+BEGIN_SRC java :results output code
>>      import rx.Observable;
>>      public class Main {
>>          public static void main(String[] args) {
>>              Observable.range(5, 5)
>>                  .subscribe(System.out::println);
>>          }
>>      }
>>    #+END_SRC
>>
>>
>>
>>
>> ian martins <ianxm@jhu.edu> writes:
>>
>> > I noticed that the tests didn't run with "make test." This updates the
>> > patch so that they can. I didn't add java to the list of default
>> languages
>> > because the java tests are slow.
>> >
>> > On Mon, Oct 5, 2020 at 9:23 AM ian martins <ianxm@jhu.edu> wrote:
>> >
>> >> I wrote those examples in an org file so I could test as I wrote them,
>> and
>> >> then exported it to make it more readable, but the export resulted in
>> >> source block headers being lost.  Here is the same without export:
>> >> ----
>> >> * Changes
>> >>
>> >> - support for functional mode (~:results value~)
>> >> - accept variables
>> >> - don't require package, class, and main definitions
>> >> - write source and result tempfiles to ~org-babel-temporary-directory~,
>> >> but respects the ~:dir~ header
>> >> - work with tramp
>> >>
>> >> * Examples
>> >> ** Example 1
>> >> This outputs "hello."  If class and main definitions aren't given the
>> >> code block will be wrapped in generic ones.
>> >>
>> >> #+begin_src java :results output silent
>> >>   System.out.print("hello");
>> >> #+end_src
>> >>
>> >> This is exactly equivalent:
>> >>
>> >> #+begin_src java :results output silent
>> >>   public class Main {
>> >>       public static void main(String[] args) {
>> >>           System.out.print("hello");
>> >>       }
>> >>   }
>> >> #+end_src
>> >>
>> >> ** Example 2
>> >> This also outputs "hello."
>> >>
>> >> #+begin_src java :results value silent
>> >>   return "hello";
>> >> #+end_src
>> >>
>> >> ** Example 3
>> >> This generates the class "Example" in the package "org.orgmode" in the
>> >> current directory.
>> >>
>> >> #+begin_src java :results output silent :classname org.orgmode.Example
>> >> :dir .
>> >>   System.out.print("hello, org-mode");
>> >> #+end_src
>> >>
>> >> ** Example 4
>> >> The "Hey" class defines a static method but no main. C-c C-c on the
>> >> "Hey" source block will write "./org/orgmode/Hey.java" and compile it.
>> >>
>> >> The "Main" class calls the "Hey" class. C-c C-c on the "Main" source
>> >> block will write "./org/orgmode/Main.java" and compile and run it.
>> >>
>> >> #+begin_src java :results output silent :dir .
>> >>   package org.orgmode;
>> >>
>> >>   public class Hey {
>> >>       public static String say() {
>> >>           return "hey";
>> >>       }
>> >>   }
>> >> #+end_src
>> >>
>> >> #+begin_src java :results output silent :dir .
>> >>   package org.orgmode;
>> >>
>> >>   public class Main {
>> >>       public static void main(String[] args) {
>> >>           System.out.print(Hey.say());
>> >>       }
>> >>   }
>> >> #+end_src
>> >>
>> >> Instead of C-c C-c, we could have added tangle headers and written the
>> >> source files out by tangling.
>> >>
>> >> ** Example 5
>> >> This prints the variable from the header
>> >>
>> >> #+begin_src java :var msg="hello, org-mode" :results output silent
>> >>   System.out.print(msg);
>> >> #+end_src
>> >>
>> >> ** Example 6
>> >> This prints "hello, org-mode." The table is provided to the method as a
>> >> list of lists.
>> >>
>> >> #+name: table
>> >> | message | hello, org-mode  |
>> >>
>> >> #+begin_src java :var tbl=table :results output silent
>> >>   System.out.print(tbl.get(0).get(1));
>> >> #+end_src
>> >>
>> >> ** Example 7
>> >> This example returns a list.
>> >>
>> >> Note that you're allowed to specify imports without defining the class
>> >> or main methods.
>> >>
>> >> #+begin_src java :results value :exports both
>> >>   import java.util.Arrays;
>> >>
>> >>   return Arrays.asList("message", "hello, org-mode");
>> >> #+end_src
>> >>
>> >> #+RESULTS:
>> >> | message | hello, org-mode |
>> >>
>> >> On Mon, Oct 5, 2020 at 8:35 AM ian martins <ianxm@jhu.edu> wrote:
>> >>
>> >>> 1 Changes
>> >>> =========
>> >>>
>> >>>   - support for functional mode (`:results value')
>> >>>   - accept variables
>> >>>   - don't require package, class, and main definitions
>> >>>   - write source and result tempfiles to
>> >>>     `org-babel-temporary-directory', but respects the `:dir' header
>> >>>   - work with tramp
>> >>>
>> >>>
>> >>> 2 Examples
>> >>> ==========
>> >>> Some examples follow.  See the tests for more examples.  I'll write
>> >>> proper docs after review.
>> >>>
>> >>> 2.1 Example 1
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This outputs "hello."  If class and main definitions aren't given the
>> >>>   code block will be wrapped in generic ones.
>> >>>
>> >>>   ,----
>> >>>   | System.out.print("hello");
>> >>>   `----
>> >>>
>> >>>   This is exactly equivalent:
>> >>>
>> >>>   ,----
>> >>>   | public class Main {
>> >>>   |     public static void main(String[] args) {
>> >>>   |         System.out.print("hello");
>> >>>   |     }
>> >>>   | }
>> >>>   `----
>> >>>
>> >>>
>> >>> 2.2 Example 2
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This also outputs "hello."
>> >>>
>> >>>   ,----
>> >>>   | return "hello";
>> >>>   `----
>> >>>
>> >>>
>> >>> 2.3 Example 3
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This generates the class "Example" in the package "org.orgmode" in
>> the
>> >>>   current directory.
>> >>>
>> >>>   ,----
>> >>>   | System.out.print("hello, org-mode");
>> >>>   `----
>> >>>
>> >>>
>> >>> 2.4 Example 4
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   The "Hey" class defines a static method but no main. C-c C-c on the
>> >>>   "Hey" source block will write "./org/orgmode/Hey.java" and compile
>> it.
>> >>>
>> >>>   The "Main" class calls the "Hey" class. C-c C-c on the "Main" source
>> >>>   block will write "./org/orgmode/Main.java" and compile and run it.
>> >>>
>> >>>   ,----
>> >>>   | package org.orgmode;
>> >>>   |
>> >>>   | public class Hey {
>> >>>   |     public static String say() {
>> >>>   |         return "hey";
>> >>>   |     }
>> >>>   | }
>> >>>   `----
>> >>>
>> >>>   ,----
>> >>>   | package org.orgmode;
>> >>>   |
>> >>>   | public class Main {
>> >>>   |     public static void main(String[] args) {
>> >>>   |         System.out.print(Hey.say());
>> >>>   |     }
>> >>>   | }
>> >>>   `----
>> >>>
>> >>>   Instead of C-c C-c, we could have added tangle headers and written
>> the
>> >>>   source files out by tangling.
>> >>>
>> >>>
>> >>> 2.5 Example 5
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This prints the variable from the header
>> >>>
>> >>>   ,----
>> >>>   | System.out.print(msg);
>> >>>   `----
>> >>>
>> >>>
>> >>> 2.6 Example 6
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This prints "hello, org-mode." The table is provided to the method as
>> >>>   a list of lists.
>> >>>
>> >>>    message  hello, org-mode
>> >>>
>> >>>   ,----
>> >>>   | System.out.print(tbl.get(0).get(1));
>> >>>   `----
>> >>>
>> >>>
>> >>> 2.7 Example 7
>> >>> ~~~~~~~~~~~~~
>> >>>
>> >>>   This example returns a list.
>> >>>
>> >>>   Note that you're allowed to specify imports without defining the
>> class
>> >>>   or main methods.
>> >>>
>> >>>   ,----
>> >>>   | import java.util.Arrays;
>> >>>   |
>> >>>   | return Arrays.asList("message", "hello, org-mode");
>> >>>   `----
>> >>>
>> >>>    message  hello, org-mode
>> >>>
>> >>
>>