

Show HN: Effective java – A tool to explore your Java code written in Clojure - ftomassetti
https://github.com/ftomassetti/effectivejava

======
dikaiosune
I like the aesthetic of using Clojure to fix Java.

~~~
lmm
Small standalone command-line tools are a good place for a language like that,
although it's a shame Clojure takes so long to start.

~~~
film42
The nice thing about Clojure development is that you really only need to start
the JVM once, after that, you can eval anything you need instantly. And
really, startup times aren't that bad. Here's Travis CI for a small project I
made. Time to start the JVM and run tests? 2.76 seconds. The entire build
completes in ~12 seconds.

[https://travis-ci.org/film42/rinok#L99](https://travis-
ci.org/film42/rinok#L99)

~~~
benaiah
How is three seconds to run tests on a "small project" "not that bad"?

~~~
ftomassetti
well, it is not that bad because as part of the tests it also parse all the
code of Javaparser and spring-jdbc (by no means small projects). Parsing it is
an expensive operation also because the Java grammar is quite ambiguous

------
hajims
Just tried running it and got this, I'm guessing I'm doing something wrong...?

[me@localhost myapp]$ java -jar effectivejava-0.1.2-SNAPSHOT-standalone.jar -l
-d "/home/me/myapp"

Exception in thread "main" java.lang.ExceptionInInitializerError at
java.lang.Class.forName0(Native Method)

...

at app.core.<clinit>(Unknown Source)

Caused by: java.lang.NullPointerException

...

Could not find the main class: app.core. Program will exit.

~~~
ftomassetti
never saw this error but current version is 0.1.3-SNAPSHOT.

The instructions are probably confusing, I will fix them. You can run: lein
jar java -jar target/effectivejava-0.1.3-SNAPSHOT.jar and then the options.

Thank you for reporting this!

~~~
hajims
quick google shows someone else had the same error:

[https://www.reddit.com/r/Clojure/comments/31uqab/writing_a_t...](https://www.reddit.com/r/Clojure/comments/31uqab/writing_a_tool_to_measure_explore_and_analyze/)

Thank you for this though, hopefully I'll get it working...

------
rickette
Looks like a nice side project. But the first question that popped into my
mind was, doesn't SonarQube already covers these rules?

~~~
ftomassetti
Yes and no. If you consider this as a linter there are many others out there.
Most of them in my opinion generate too much noise. I think that effectivejava
is useful to explore your codebase, run a few queries and find out some facts
about your code: how many utils classes do you have? How many methods are
taking more than 5 parameters? You can run easily the queries on the whole
project or just some packages and correct your aim as you find facts (for
example, you may start asking how many methods take more than 5 parameters and
realize they are 1000, then you want probably to start focusing on the methods
taking more than 10 parameters. Or you can find that some classes with this
problem are generated code and you do not want to consider them).

About the usage as a linter it tries to keep rules to a minimum of sensible
rules, the ones explained in Effective Java. We chose them because they are
rules well understood and accepted by the vast majority of developers so we
hope to reduce the number of questionable findings returned to the user.

~~~
speedkills
This is pretty cool. Are you planning on extending the querying ability at
all? I would love to be able to use this like Hoogle, point it at my scala
code and query for all methods that take a list and return an int, for
example.

~~~
ftomassetti
Well, I am very interested in parsing and static analysis and if you idea and
suggestions feel free to open as many tickets as you want on the project.

Yes, Hoogle is super cool, it would be definitely useful to have something
like that.

I wrote in the past tools to manipulate ASTs of several languages but I have
never looked in a Scala parser. Can you suggest one?

