ojAlgo's install snippet ships a placeholder version and a paid solver tier
oj! Algorithms - Open Source Java library for mathematics, linear algebra and optimisation. Pure Java, zero dependencies: fast matrices plus LP, QP and MIP solvers.
At a glance
- What is it?
- A zero-dependency Java library for linear algebra and for linear, quadratic and mixed-integer programming, currently on version 57. The default branch is develop, the flagship example stops mid-comment, and the feature list and the commercial page disagree about what the solver integrations cost.
- Who is it for?
- Use ojAlgo if you want a numerical library with no dependency tree to audit, and if you are willing to treat the source as the documentation the author insists it is. Three things to settle first.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The default branch is develop, not main
The branch you land on when you open the repository is the development branch. For a library that ships to a central repository under a coordinate most projects never change, that is an unusual default, and it means the front page you read is not necessarily the front page of the last release. The release sequence explains why: the current line is 57, with 57.3.1 on the twenty-second of September and 57.2.0 at the end of August, so the major version is functioning as an iteration counter rather than as a compatibility promise. A major bump every few weeks is fine for an internal-iteration scheme and awkward for anyone who has been trained to read a major number as a stability boundary. The readme does not explain the scheme, so nothing on the page tells you how to reason about version jumps.
The dependency snippet's version is the literal placeholder
The install instructions point at the central repository and then give the coordinate block. The version element inside it is not a version. It is three capital letters separated by dots, a placeholder that has to be replaced, so a reader who copies the block as printed gets a dependency no resolver can satisfy. That is a defensible choice, since hardcoding one version in a readme guarantees it goes stale, and the surrounding text does say the library is available at the repository to be used with your favourite dependency management tool. What is missing is any guidance on which version to pick. The release list at the top of the page is the only signal, and a curated versions page is linked as a badge rather than named in the prose, so the practical instruction is read the badge, then decide.
Solver integrations appear as both a feature and a paid extra
One bullet in the feature list describes the optimisation tooling as pure Java with zero dependencies, and then adds that there are also integrations with third-party solvers. Two sections later, the commercial section says a paid subscription gives you priority support and third-party solver integrations. Those two statements put the same capability in two different price categories, and the readme does not reconcile them. The charitable reading is that the open-source library can call out to external solvers, while the subscription covers the maintained integrations themselves. The charitable reading is not stated anywhere, and a reader planning an architecture around a commercial solver has no way to tell from this page which part they would have to pay for or what the zero-dependency claim survives once an external solver is in the path.
The speed claim rests on a benchmark that keeps moving
The headline is that this is the fastest pure Java linear algebra library available, and the first bullet is careful about where that comes from. It attributes the statement to the latest results from a third-party Java matrix benchmark and states explicitly that the benchmark was not written by anyone associated with the project. Disclosing the conflict of interest, or the absence of one, is rarer than it should be and deserves credit. The weakness is the word latest. No result is reproduced on the page, no date is given, and no version of the library or of the benchmark is stated, so the claim cannot be checked from the readme and silently changes meaning as the benchmark is rerun. A superlative sourced to a moving third-party document is a claim to verify on the day you evaluate, not a property to assume.
Every example lives in a gist and the flagship one stops mid-comment
The worked example on the page builds a small production model with two variables bounded above and below and an objective weight on each. It stops there, in the middle of a comment, before the constraint that the surrounding prose introduces, which is the machine-hour limit. The text after the block explains that the same pattern covers all three problem classes, calling an integer or binary method on a variable for integer models and setting quadratic terms on an expression for quadratic ones, which is the genuinely useful part and is stated in words rather than code. Separately, the readme states that all example code from the blog posts lives in a single multi-file gist hosted off the repository. So the two places a newcomer would look for runnable examples, the page and the tree, contain one truncated fragment and nothing else.
Eclipse project files and a launch configuration are committed
The repository root carries IDE metadata that a Maven project normally keeps out of version control. There is an Eclipse project file, an Eclipse settings directory, and a classpath file, all tracked. Alongside them is a launch configuration for running something called the functionality tests, and its filename contains spaces. That last one is the interesting artefact: part of the test surface appears to be driven from an IDE launch file, which means the wrapper command used in the build instructions, which compiles, tests and packages through the wrapper, may not exercise everything the maintainer runs locally. None of this is harmful and the settings directory may hold genuinely shared configuration, but for a library whose stated selling point is that the source is the documentation, having one contributor's desktop preferences in the root works against the stated idea.
The agent skill is a different repository and Context7 is unmentioned
The documentation section does something increasingly common and done well here: it names a plain-text index for language models and links to a skill, and the skill turns out to live in a separate repository rather than in this one. So the agent-facing surface of ojAlgo is split across two projects, and a user who clones this repository to read the source does not get the skill. The root also contains a configuration file for a third-party documentation service, which appears nowhere in the readme text. Taken together the three give a picture worth noting: the library registers itself with at least one external documentation index, publishes its own index, and delegates its assistant skill to a sibling repository. The readme mentions two of those three.
Zero dependencies, and an instruction to ignore the artifact
Two positions on the page are worth putting side by side because they pull against each other. The pitch is a rich feature set with zero dependencies, and the build is a wrapper that needs no separate tool install:
git clone https://github.com/optimatika/ojAlgo.git
cd ojAlgo
./mvnw compile # Compile
./mvnw test # Run tests
./mvnw package -DskipTests # Build JAR without testsSo the whole consumption story is four lines of shell and Java 11 or newer. The arrays are more unusual than the pitch suggests: they can be sparse or dense, carry complex, rational and quaternion values, and have their memory allocated off the Java heap or in a file. Then the readme tells you to clone or fork the repository, work directly with the source, and read it, on the grounds that the source is part of the documentation. That is an unusual instruction from a library that publishes a convenient artifact, and it is consistent with a mature project whose value is in the implementation rather than the API surface.
Editorial conclusion
Use ojAlgo if you want a numerical library with no dependency tree to audit, and if you are willing to treat the source as the documentation the author insists it is. Three things to settle first. The dependency snippet carries a placeholder rather than a version, so pin a real one deliberately against the central repository. The third-party solver integrations appear both as a feature and as a subscription benefit, so find out which you are getting before designing around them. And the speed claim rests on a benchmark that moves over time, so check the current result yourself rather than taking the adjective on the front page.
Frequently asked questions
How do I add ojAlgo to a Maven project?
As a dependency from the central repository with group org.ojalgo and artifact ojalgo. The README's snippet leaves the version element as the placeholder X.Y.Z, so you have to substitute a real version yourself.
Does ojAlgo have any runtime dependencies?
The project describes itself as pure Java with zero dependencies. Building from source needs Java 11 or newer and uses the Maven Wrapper, so no separate Maven installation is required.
Is ojAlgo free for commercial use?
The library is released under the MIT licence. A separate paid subscription covers priority support and third-party solver integrations, which the feature list also mentions as part of the library's optimisation tooling.
Does ojAlgo provide a skill for AI coding assistants?
Yes, but it is hosted in a separate skills repository rather than in this one, alongside a plain-text index at the project site. A configuration file for a third-party documentation service is also present at the repository root.
Which optimisation problem types can ojAlgo solve?
Linear, quadratic and mixed-integer, through one model pattern. Call the integer or binary method on a variable for integer models, and set quadratic terms on an expression for quadratic ones.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/optimatika-ojalgo)